首页 > 解决方案 > 相当于带有数字键的对象的拼接

问题描述

假设我有一个这样的对象:

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)找到缺少键的间隙(最终,我想对任意数量的间隙执行此操作),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])

标签: javascript

解决方案


您可以将值分配给对象。

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);

对剩余键使用队列。这适用于多个剩余密钥。

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);


推荐阅读