javascript - 如何清理空数组对象并重新编号?

标签 javascript arrays javascript-objects

我有一个像这样的 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/

相关文章:

javascript - 为什么 `(foo) = "bar"` 在 JavaScript 中是合法的?

javascript - 如何使用变量作为对象中的键?

javascript - 我可以在 Switch 语句上使用对象吗?

javascript - Protractor:访问返回对象的属性

javascript - 如何更改 JavaScript 中文本标签的堆栈顺序?

javascript - jQuery/javascript - 加载前获取图像大小

c - 如何在 C 中实现 next() PHP 函数

c - 数组初始化程序返回什么?

c++ - 数组的平均分数

javascript - 在 IE 中将对象转换为数组(Javascript)