在嵌套数组中搜索JavaScript中的空对象

时间:2018-07-16 11:08:18

标签: javascript arrays

var array = [
  {
    key: 'value',
    subArray: [{ key: 'value', subArray: [{}] }]
  },
  {
    key: 'value',
    subArray: [{ key: 'value', subArray: [{ key: 'value', subArray: [] }] }]
  },
  { key: 'value', subArray: [] }
];

在我的应用程序中,我有对象数组。每个对象都有包含另一个数组的字段,该字段可以包含另一个包含数组的对象,依此类推。在某些情况下,对象可能为空。我需要写函数,该函数将遍历所有数组,找到emty对象并将其删除。我该如何实现?

4 个答案:

答案 0 :(得分:1)

我认为解决方案是使用递归。

var array = [
  {
    key: 'value',
    subArray: [{ key: 'value', subArray: [{}] }]
  },
  {
    key: 'value',
    subArray: [{ key: 'value', subArray: [{ key: 'value', subArray: [] }] }]
  },
  { key: 'value', subArray: [] }
];


function lookup(subArr) {
    subArr.forEach((sa, i) => {
        if (Object.keys(sa).length == 0) {
           delete subArr[i];
        } else {
           lookup(sa.subArray);
        }
    });
}


array.forEach(a => {
    lookup(a.subArray);
});


console.log(array);

答案 1 :(得分:0)

尝试

for (var i = 0; i < array.length; i++ ) {
  if (array[i].subArray.length != 0) {
    if (Object.keys(array[i].subArray).length)) {
      delete Object.keys(array[i].subArray
    }
  }
}

可能对您有用

答案 2 :(得分:0)

尝试这样。希望它将有助于找出解决方案:

for (var i = 0; i < array.length; i++ ){
    if(array[i].subArray)
    {
        removeEmptyItems(array[i].subArray);
    } 
}

removeEmptyItems(item: any) {
    if(item.length == 0){
        delete item;
        return;
    }
    if (item.subArray) {            
        removeEmptyItems(item.subArray);
    } 
}

答案 3 :(得分:0)

如果要查找空对象并将其删除(换句话说,将subArray: [{}]转到subArray: []),则可以使用递归函数来实现,该函数将所有出现的数组替换为一个空对象空数组:

var array = [
  {
    key: 'value',
    subArray: [{ key: 'value', subArray: [{}] }]
  },
  {
    key: 'value',
    subArray: [{ key: 'value', subArray: [{ key: 'value', subArray: [] }] }]
  },
  { key: 'value', subArray: [] }
];

function removeEmptyObjects(obj) {

    var objCopy = Object.assign({}, obj);

    Object.keys(objCopy).forEach(key => {

        if (!Array.isArray(objCopy[key])) return;

        var containsEmptyObject = objCopy[key].length === 1 && typeof objCopy[key][0] === 'object' && Object.keys(objCopy[key][0]).length === 0;

        objCopy[key] = containsEmptyObject ? [] : objCopy[key].map(removeEmptyObjects);

    });

    return objCopy;

}

var result = array.map(removeEmptyObjects);

console.log(JSON.stringify(result, null, 2));