假设我有这样一个对象:
const obj = {
0: { name:'zero'},
1: { name: 'one'},
3: { name: 'three'},
4: { name: 'four'}
};
我想“打包”它,这样如果键是数组索引,数组中就没有间隙。
{
0: { name:'zero', ...},
1: { name: 'one', ...},
2: { name: 'three', ...},
3: { name: 'four', ...}
}
我不想替换obj
,我想破坏性地进行。
按照我的理解,我有两项工作:1) 找到缺少 key 的空隙(最终,我想对任意数量的空隙执行此操作),2) 通过移动值来填补空隙向后。
在我搜索丢失的键的循环中,break
似乎立即发生了。此外,剩余的代码(我认为可能有效)非常冗长。谁能帮我找到更好的解决方案?
const obj = {
0: { name:'zero'},
1: { name: 'one'},
3: { name: 'three'},
4: { name: 'four'}
};
let expectedKey = 0
for (const [key, value] in obj) {
if (key !== expectedKey) break
expectedKey++
}
let missingKey = expectedKey
let keys = Object.keys(obj)
console.log(`missing key is ${missingKey} <<< why is this wrong`)
for (let k = missingKey; k < keys.length; k++) {
let nextKey = (k == keys.length-1) ? null : k+1
if (nextKey) obj[k] = obj[nextKey]
}
lastKey = keys[keys.length-1]
delete obj[lastKey]
console.log(obj[3])
最佳答案
您可以将值分配给一个对象。
var obj = { 0: { name:'zero'}, 1: { name: 'one'}, 3: { name: 'three'}, 4: { name: 'four'} };
obj = Object.assign({}, Object.values(obj));
console.log(obj);
如有必要,您可以将值重新分配给新键。
var obj = { 0: { name:'zero'}, 1: { name: 'one'}, 3: { name: 'three'}, 4: { name: 'four'} },
i = 0,
k;
for (k in obj) {
if (+k !== i) {
obj[i] = obj[k];
delete obj[k];
}
i++;
}
console.log(obj);
使用剩余键的队列。这适用于多个剩余 key 。
var obj = { 0: { name:'zero'}, 1: { name: 'one'}, 3: { name: 'three'}, 4: { name: 'four'} },
i = 0,
k,
queue = [];
for (k in obj) {
if (+k !== i) {
obj[i] = obj[k];
queue.push(+k);
}
if (queue[0] === i) queue.shift();
i++;
}
while(queue.length) delete obj[queue.shift()];
console.log(obj);
关于javascript - 相当于用数字键拼接一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54970535/