如何用JavaScript筛选包含指定数组所有元素的嵌套对象数组
使用JavaScript筛选包含指定所有联系人的嵌套对象数组
需求说明
给定目标名称数组:
const targetNames = ["Javascript", "Salesforce"];
以及如下嵌套对象数组:
const data = [ { "Id":"1", "Country":"USA", "Contact":[ { "Name":"Javascript", "City":"ABC", }, ], }, { "Id":"2", "Country":"USA", "Contact":[ { "Name":"Javascript", "City":"ABC", }, { "Name":"Salesforce", "City":"XYZ", }, ], }, ];
需要筛选出Contact子数组包含所有目标名称的记录,最终保留Id为2的对象。
实现方案
方案1:基础实现(filter + every + some)
通过数组高阶方法组合实现核心筛选逻辑:
const filteredData = data.filter(item => { // 验证目标数组的每个名称,都能在当前项的Contact中找到匹配项 return targetNames.every(targetName => { return item.Contact.some(contact => contact.Name === targetName); }); }); console.log(filteredData);
方案2:性能优化(用Set减少重复查询)
当数据量较大时,将Contact的名称存入Set可将查询复杂度从O(n)降为O(1),大幅提升效率:
const filteredData = data.filter(item => { // 提取当前项所有联系人名称,存入Set以快速查询 const contactNameSet = new Set(item.Contact.map(contact => contact.Name)); // 验证所有目标名称都存在于Set中 return targetNames.every(name => contactNameSet.has(name)); }); console.log(filteredData);
最终输出结果
执行上述代码后,会得到期望的筛选结果:
[ { "Id":"2", "Country":"USA", "Contact":[ { "Name":"Javascript", "City":"ABC", }, { "Name":"Salesforce", "City":"XYZ", }, ], }, ]
内容的提问来源于stack exchange,提问作者Ruchi Sharma
相关产品推荐
相关产品推荐

