我有一个像这样的 JavaScript 对象
{0: [], 1: [0: 'a', 1: 'b'], 2: [], 3: [0: '20']}
我想去掉这个对象中的空槽并对剩余的空槽重新编号,使其具有正常的顺序 (0, 1, 2)。
我使用这个功能:
function clean(obj) {
for (var propName in obj) {
if (obj[propName] === null || obj[propName].length == 0 || obj[propName] === undefined) {
delete obj[propName];
}
}
}
这会清除对象,但随后我得到了
{1: [0: 'a', 1: 'b'], 3: [0: '20']}
但是我如何使 1 变成 0 和 3 变成 1 呢?
最佳答案
首先,你的问题有问题,因为你的第一个对象的定义没有通过JS编译。数组元素被赋予一个带有索引的“键”,您编写... 1: [0: 'a', 1: 'b']
应该是:
1: {0: 'a', 1: 'b'}
或
1: ['a','b']
您显然混淆了数组的索引和对象的键
。
在这里,您为对象键指定其数组中索引的名称。所以也许您正在问三个问题之一。 (我会逐一回答):
// 1. Clean [[], ['a','b'], [], '20']
// returning: [['a','b'], ['20']]
// and not using params at all.
// 2. Clean {0: [], 1: ['a','b'], 2: [], 3: ['20']}
// returning: {0: ['a','b'], 1: ['20']}
// 3. Clean {0: {}, 1: {0: 'a', 1: 'b'}, 2: {}, 3: {0: '20'}}
// returning: {0: {0: 'a', 1:'b'}, 1: {0: '20'}}
保持函数完整的最快方法是在函数底部添加一个新的“索引器”,以更正键。我们可以按如下方式使用 ES6:
// if to delete...
let oldKey = paramName;
let newKey = (obj.keys().indexOf(oldKey)) - 1;
delete obj[oldKey].assign(o, {[newKey]: o[oldKey] })[oldKey];
这个不是很清楚。
最清晰的方法是使用另一个对象,并仅当原始元素有值时才填充下一个元素,从索引零开始并增加它。
function cleanup(obj) {
let newObj = {};
let idx = 0;
for (var propName in obj) {
let prop = obj[propName];
console.log('prop', propName, JSON.stringify(prop))
if (prop !== null
&& prop !== undefined
&& JSON.stringify(prop) != "[]" // not empty array
&& JSON.stringify(prop) !== "{}") { // not empty obj
newObj[idx] = prop;
idx++;
}
}
return newObj;
}
参见my JS fiddle which shows this .
您还可以使用对象的keys() 方法按照从迭代器获取键名的顺序获取键名数组。对于数组,您可以使用 splice(0,idx) 来删除该元素。
https://www.w3schools.com/js/js_array_methods.asp
或者你可以使用分割,但是你必须“向后”工作,否则 for 循环将无法正常工作。因此,首先获取 Prop 名称,然后从最后一个到第一个弹出的过程进行操作。
关于javascript - 如何清理空数组对象并重新编号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300005/