如何删除数组中的空对象?

问题描述

我正在尝试从下面的结构中删除空对象 {}。

data =  [{
            "total" : "value","status" : "statusVal","recs" : [{
                    "total" : "value","region" : "name","recs" : [{},{
                            "recs" : [{
                                    "recs" : [{
                                            "value" : "a","label" : "fn"
                                        }]
                                }]
                        }]
                }]
        }]

这是我处理数据并尝试从结果中删除空对象的 JavaScript 代码

var result = json.parse(data);
for(var i=0;i<result.length;i++){
   if(result[i].hasOwnProperty("recs")){
      var fset = result[i].recs;
      for(var j=0;j<fset.length;j++){
         if(fset[j].recs === undefined || fset[j].recs === null){
            delete fset[j].recs;
         }
         if(fset[j].hasOwnProperty("recs")){
           var sset = fset[i].recs;
             for(var k=0;k<sset.length;k++){
                var tset = sset[i].recs;
                if(sset[k].hasOwnProperty("recs")){
                   for(var z=0;z<tset.length;z++){
                      if(tset[z].hasOwnProperty("recs")){
                         //  logic to push 
                      }
                   }
                }
             }
         }
      }
   }
}

我尝试检查 null 和 undefined 并将属性检查 bool 设为 false。由于空 {} 始终返回长度为 1,因此也排除了这种情况。我被困在这里处理空对象的删除

以上代码删除了整个 recs 节点。你能帮我找到我缺少的东西吗?

解决方法

检查 Object.keys() 的长度以查看对象是否为空。

Object.keys(fset[j].recs).length === 0 

您无法手动迭代数组的所有动态级别,因此最好编写具有递归函数调用的函数。

var data = [{
  "total": "value","status": "statusVal","recs": [{
    "total": "value","region": "name","recs": [{},{
      "recs": [{
        "recs": [{
          "value": "a","label": "fn"
        }]
      }]
    }]
  }]
}]

function removeEmpty(ary) {
  ary.forEach((item,index) => {
    if (Object.keys(item).length === 0) { ary.splice(index,1); }
    else if (item.recs && item.recs.length > 0)
      removeEmpty(item.recs)
  });
}

removeEmpty(data)
console.log(data)