如何在嵌套对象数组中搜索关键词?(禁用flatMap)
JavaScript嵌套数组匹配搜索解决方案
需求说明
给定嵌套对象数组,需搜索所有id.name包含关键词“pp”的项,结果需包含:
- 匹配的父级对象的
id - 该父级对象嵌套
fruits数组中匹配的子级对象的id
要求不能使用flatMap,修正原有错误实现。
原代码问题分析
原有代码错误使用Array.filter:filter的回调函数需返回布尔值(决定是否保留当前元素),但原代码中试图返回数组,完全违背filter的设计逻辑,导致无法正确收集父级和子级的匹配项。
正确实现方案
通过遍历外层数组,逐个处理父级对象,先收集匹配的父级id,再遍历其fruits数组收集匹配的子级id,最终合并结果:
let arr = [ { id:{key:1, name:"apple"}, fruits:[{id:{key:1.1,name:"green apple"}},{id:{key:1.2, name: "red apple"}}] }, { id:{key:2, name:"grapes"}, fruits:[{id:{key:2.1,name:"green grapes"}},{id:{key:2.2, name: "black grapes"}}] }, { id:{key:3, name:"berries"}, fruits:[{id:{key:3.1,name:"strawberries"}},{id:{key:3.2, name: "blueberries"}}] }, { id:{key:4, name:"banana"}, fruits:[{id:{key:4.1,name:"yellow banana"}}] } ] const search = "pp" function filterResult(obj) { const re = new RegExp(search, "ig") return re.test(obj.id.name) } const searchResult = []; // 遍历外层数组处理每个父对象 arr.forEach(parent => { // 父级id匹配则加入结果 if (filterResult(parent)) { searchResult.push(parent.id); // 遍历子级fruits收集匹配项 parent.fruits.forEach(child => { if (filterResult(child)) { searchResult.push(child.id); } }); } }); console.log(searchResult);
执行结果
运行后将输出预期结果:
[{key:1, name: "apple"}, {key:1.1,name:"green apple"},{key:1.2, name: "red apple"}]
内容的提问来源于stack exchange,提问作者Dumpling
相关产品推荐
相关产品推荐

