繁体   English   中英

使用Array.prototype.filter过滤嵌套的子对象

[英]Using Array.prototype.filter to filter nested children objects

我有一个类似于以下代码块的对象数组:

 var arr = [ { text: 'one', children: [ { text: 'a', children: [ { text: 'something' } ] }, { text: 'b' }, { text: 'c' } ] }, { text: 'two' }, { text: 'three' }, { text: 'four' } ]; 

在以上结构中,我想在text属性中搜索一个字符串,并且需要对所有children进行搜索。

例如,如果我搜索something ,结果应为以下形式的对象数组:

 [ { children: [ { children: [ { text: 'something' } ] } ] } ]; 

请注意,所有的text不匹配输入字符串性质something已被删除。

我使用Array.prototype.filter提出了以下代码块。 但是,我仍然可以在结果中看到其他属性:

 function search(arr, str) { return arr.filter(function(obj) { if(obj.children && obj.children.length > 0) { return search(obj.children, str); } if(obj.text === str) { return true; } else { delete text; return false; } }); } 

这是小提琴链接: https : //jsfiddle.net/Lbx2dafg/

我究竟做错了什么?

我建议使用Array#forEach ,因为filter返回一个数组,这是必需的,但不实际,因为它返回所有带有它的子级。

该提议从找到的项目中生成一个新数组,其中包含旺旺项目textchildren

该解决方案是迭代和递归的。 它查找所有出现的搜索字符串。

 function filter(array, search) { var result = []; array.forEach(function (a) { var temp = [], o = {}, found = false; if (a.text === search) { o.text = a.text; found = true; } if (Array.isArray(a.children)) { temp = filter(a.children, search); if (temp.length) { o.children = temp; found = true; } } if (found) { result.push(o); } }); return result; } var array = [{ text: 'one', children: [{ text: 'a', children: [{ text: 'something' }] }, { text: 'b' }, { text: 'c' }] }, { text: 'two' }, { text: 'three' }, { text: 'four' }]; console.log(filter(array, 'something')); 

您的函数search返回一个带有“父”级别的对象的数组,这就是为什么“仍然在结果中看到额外的属性”的原因
其次,此行delete text; 不删除对象或对象属性-应该delete obj.text;
这是使用其他Array.map功能的解决方案:

function search(arr, str) {
    return arr.filter(function(obj) {
        if (obj.text !== str) {
           delete obj.text;
        }
        if (obj.children && obj.children.length > 0) {
           return search(obj.children, str);
        }

        if (obj.text === str) {
           return true;
        } else {
           delete obj.text;
           return false;
        }
    });
}

var result = search(arr, 'something').map(function(v) {  // filtering empty objects
   v['children'] = v['children'].filter((obj) => Object.keys(obj).length);
   return {'children':v['children'] };
});
console.log(JSON.stringify(result,0,4));

输出:

[
    {
        "children": [
            {
                "children": [
                    {
                        "text": "something"
                    }
                ]
            }
        ]
    }
]

https://jsfiddle.net/75nrmL1o/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM