从嵌套javascript对象中删除属性的最佳方法是什么?

从嵌套javascript对象中删除属性的最佳方法是什么?,javascript,json,recursion,javascript-objects,Javascript,Json,Recursion,Javascript Objects,我有一个树对象,如下所示,我试图删除items数组属性,如果它是空的。我不确定这样做的最佳方法是什么 我正在考虑循环键,检查属性,然后使用delete myJSONObject[prop]删除。。。欢迎有任何想法/想法 [{ text: "TreeRoot", items: [{ text: "Subgroup1", items: [] }, { text: "Subgroup2", items: []

我有一个树对象,如下所示,我试图删除items数组属性,如果它是空的。我不确定这样做的最佳方法是什么

我正在考虑循环键,检查属性,然后使用
delete myJSONObject[prop]
删除。。。欢迎有任何想法/想法

[{
    text: "TreeRoot",
    items: [{
        text: "Subgroup1",
        items: []
    }, {
        text: "Subgroup2",
        items: []
    }, {
        text: "Subgroup3",
        items: [],
        items: [{
            text: "subgroup5",
            items: [{
                text: "subgroup6",
                items: [{
                    text: "subgroup7",
                    items: [{
                        text: "subgroup8",
                        items: []
                    }]
                }]
            }]
        }]
    }]
}]

您可以使用递归算法,该算法在每个步骤中删除
数组并返回,或者递归处理数组中的每个单独对象

我也会尝试在服务器端这样做。它将节省大量的复杂性、内存和处理时间。通常有几种方法可以从JSON编码的字符串中“排除”空数组

这应该可以完成工作(ES5):

在ES6中相同:

function removeEmpty(obj) {
  Object.keys(obj).forEach(function(key) {
    (key === 'items' && obj[key].length === 0) && delete obj[key] ||
    (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key])
  });
  return obj;
};
const removeEmpty = (obj) => {
  Object.keys(obj).forEach(key =>
    (key === 'items' && obj[key].length === 0) && delete obj[key] ||
    (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key])
  );
  return obj;
};
以下是一个使用

//const objectScan=require('object-scan');
const data=[{text:'TreeRoot',items:[{text:'Subgroup1',items:[]},{text:'Subgroup2',items:[]},{text:'Subgroup3',items:[{text:'subgroup5',items:[{text:'subgroup7',items:[{text:'subgroup8',items:[]}]}]}]}];
常量修改=(obj)=>objectScan(['**.items']{
rtn:'计数',
filterFn:({value,parent,property})=>{
if(Array.isArray(value)&&value.length==0){
删除父项[属性];
返回true;
}
返回false;
}
})(obj);
console.log(修改(数据));//返回删除的次数
// => 3
控制台日志(数据);
//=>[{text:'TreeRoot',items:[{text:'Subgroup1'},{text:'Subgroup2'},{text:'Subgroup3',items:[{text:'subgroup5',items:[{text:'subgroup6',items:[{text:'subgroup8'}]}]}]
。作为控制台包装{最大高度:100%!重要;顶部:0}

这个老问题又被提了出来,我认为现代JS与递归很好地结合在一起,可以得到一个简单的答案,以不变的方式实现这一点:

const removemptyitems=(xs)=>
map({items=[],…rest})=>({
休息
…(items.length?{items:removemptyitems(items)}:{})
}))
const tree=[{text:“TreeRoot”,items:[{text:“subsubc1”,items:[]},{text:“subc2”,items:[]},{text:“subc3”,items:[{text:“subc5”,items:[{text:“subc7”,items:[{text:“subc8”,items:[]}]}]}]}]
console.log(removemptyitems(tree))

。作为控制台包装{max height:100%!important;top:0}
我将构建一个新对象,而不是试图修改这个对象。嘿,你解决了这个问题吗?