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)找到缺少键的间隙(最终,我想对任意数量的间隙执行此操作),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);
对剩余键使用队列。这适用于多个剩余密钥。
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 - 使用 JavaScript 在浏览器控制台中调用 Firefox 的 :screenshot 辅助函数
- java - 如何在while循环中使用switch case将base 10转换为任何base?
- nativescript - 无法通过点击按钮在 android 上播放声音
- mysql - 使用 mysql 从所有数据库中获取所有表
- c++ - 为什么这只有一半回溯?
- python - x86-64 程序集 - 在堆栈上创建一个字符串或为 CreateFile 创建一个寄存器
- python - Python os.system grep 与 bash grep 的结果不同
- kubernetes - 来自 kubernetes 秘密的掌舵值?
- google-app-engine - “内存”和“带宽”是否相同?在 Google App Engine 中是什么意思?
- angular - 编辑新添加的行并更新对该行的更改,而不是使用 angular8 中的 formArray 反应形式创建新项目