[英]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返回一个数组,这是必需的,但不实际,因为它返回所有带有它的子级。
该提议从找到的项目中生成一个新数组,其中包含旺旺项目text
和children
。
该解决方案是迭代和递归的。 它查找所有出现的搜索字符串。
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"
}
]
}
]
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.