javascript - 相当于用数字键拼接一个对象

标签 javascript

假设我有这样一个对象:

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/

相关文章:

javascript - 计算数字的平均值

javascript - 使用 jQuery 显示隐藏图像

javascript - HTML5 Canvas 图像使用按钮从左到右向上移动

javascript - 使用反斜杠转义字符串中的引号

javascript - Google 柱形图 - 列值与轴不匹配

javascript - jquery mobile,显示加载覆盖时禁用所有按钮

javascript - 在javascript中进行左外连接

javascript - 我想制作一个自定义的dojo JsonRest商店,有一部分我不明白

javascript - 我如何使用 map 呈现项目列表但每 3 个项目分组?

javascript - 什么可能导致无限滚动过早加载?