我的代码中有一个字典,例如:
{1:“苹果”, 2:“葡萄” 3:“瓜” 4:“香蕉” 5:“ ...”, 6:“ ...”, 7:“ ...”}
现在我要处理的是以不中断键的方式从此字典中删除项目。
我的意思是:如果我删除2:“'grapes'”,则字典键在2处应有空格。
我的目标: {1:“苹果”, 2:“瓜” 3:“香蕉” 4:“ ...”, 5:“ ...”, 6:“ ...”}
请记住,每次运行时值都是随机的,因此解决方案不能基于字典中的值。 我完全不知道从哪里开始这个问题,而且一直困扰着我。
我知道将字典改为数组会更容易,但可惜我没有这样做的权限。它必须保留字典。
感谢您的帮助。
答案 0 :(得分:2)
正如您所说,它确实应该是一个数组。
但是由于您大概知道要删除的索引,因此只需从此处进行重新编号即可:
function remove(a, index) {
while (a.hasOwnProperty(index + 1)) {
a[index] = a[index + 1];
++index;
}
delete a[index];
return a;
}
实时示例:
function remove(a, index) {
while (a.hasOwnProperty(index + 1)) {
a[index] = a[index + 1];
++index;
}
delete a[index];
return a;
}
const a = {1: 'apples', 2: 'grapes', 3: 'melons', 4: 'bananas'};
console.log("before:", Object.entries(a).join("; "));
remove(a, 2);
console.log("after:", Object.entries(a).join("; "));
请注意,在某些JavaScript引擎上,在对象上使用delete
会大大减慢随后对其属性的访问。您可以改为创建 replacement 对象:
function remove(a, index) {
const rv = {};
let delta = 0;
for (let n = 1; a.hasOwnProperty(n); ++n) {
if (n === index) {
delta = -1;
} else {
rv[n + delta] = a[n];
}
}
return rv;
}
function remove(a, index) {
const rv = {};
let delta = 0;
for (let n = 1; a.hasOwnProperty(n); ++n) {
if (n === index) {
delta = -1;
} else {
rv[n + delta] = a[n];
}
}
return rv;
}
let a = {1: 'apples', 2: 'grapes', 3: 'melons', 4: 'bananas'};
console.log("before:", Object.entries(a).join("; "));
a = remove(a, 2);
console.log("after:", Object.entries(a).join("; "));
但同样,确实应该使用为此设计的数据结构:数组:
const a = ['apples', 'grapes', 'melons', 'bananas'];
console.log("before:", Object.entries(a).join("; "));
a.splice(1, 1); // Remove the entry at index 1
console.log("after:", Object.entries(a).join("; "));
答案 1 :(得分:1)
认为这样的事情应该起作用。您需要注意JavaScript对象不能具有数字键(它们已隐式强制转换为字符串)。
var dict = {
1 : 'a',
2 : 'b',
3 : 'c',
4 : 'd',
5 : 'e'
};//note, that JS objects can't have numeric keys. These will be coerced to strings
function reKeyDict(obj){
var keys = Object.keys(obj);//get an array of all keys;
var len = keys.length;
var greatest = Math.max(...keys);
keys = keys.sort(function(a,b){ return a - b; });
for(i = 1; i <= len; i++){//this needs to change if you want zero based indexing.
if(! keys.includes(i+"")){//we need to coerce to string
//we found a gap
for(var j = i+1, openSlot = i; j <= greatest; j++){
if(obj[j] !== undefined){
obj[openSlot++] = obj[j];
delete obj[j];
}
}
}
}
}
delete dict['3'];
delete dict['4'];
reKeyDict(dict);
console.log(dict);
如上所述,这实际上不是JavaScript对象的用例。为此创建的数据结构是一个数组。但是...如果您需要这样做,希望对您有所帮助。
上面的代码正在执行稳定的操作(这意味着将保留原始对象的顺序)。
答案 2 :(得分:-1)
这是一个数组还是一个对象?这是从对象执行操作的方法,如果它是数组,则只需将值部分替换为数组。
对象:
const obj = { 1: 'a', 2: 'b', 3: 'c' }
const values = Object.values(obj) // [ 'a', 'b', 'c' ]
const newObj = values.reduce((acc, value, i) => {
acc[i+5] = value // replace i+5 with whatever key you want
return acc
}, {})
// {5: "a", 6: "b", 7: "c"}
编辑: 糟糕...您的标题“如何更改字典中的所有键但保留值?”和描述希望相反的事情发生。