如何高效利用另一数组值过滤含嵌套属性的对象数组
高效筛选嵌套分类ID的数组对象方案
问题背景
现有包含嵌套分类信息的对象数组:
const list = [ { "title": "Église Saint-Julien", "distance": 1841, "excursionDistance": 1575, "categories": [ { "id": "300-3200-0030", "name": "Église", "primary": true }, { "id": "300-3000-0025", "name": "Monument historique" } ] }, { "title": "Sevdec", "distance": 2250, "excursionDistance": 301, "categories": [ { "id": "700-7600-0322", "name": "Station de recharge", "primary": true } ] }, { "title": "SIEGE 27", "distance": 2651, "excursionDistance": 1095, "categories": [ { "id": "700-7600-0322", "name": "Station de recharge", "primary": true } ] } ];
另有两个分类ID数组:
const mCat1 = ["300-3000-0000","300-3000-0023","300-3000-0030","300-3000-0025","300-3000-0024","300-3100"]; // 旅游类 const mCat2 = ["400-4300","700-7600-0322"];
需求是分别从list中筛选出至少有一个categories.id匹配对应mCat数组中ID的对象,但传统循环实现在大数据集下性能开销过高,需要更高效的实现方式。
高效实现方案
核心优化点是将分类ID数组转换为Set结构——Set的成员查找时间复杂度为O(1),远优于数组includes方法的O(n),数据量越大性能提升越明显。结合数组原生的filter和some方法实现高效筛选,具体步骤如下:
1. 转换ID数组为Set
const mCat1Set = new Set(mCat1); const mCat2Set = new Set(mCat2);
2. 编写通用筛选函数
复用筛选逻辑,避免重复代码:
function filterByCategorySet(list, categorySet) { return list.filter(item => { // 检查当前对象的categories中是否有ID存在于目标Set中 return item.categories.some(category => categorySet.has(category.id)); }); }
3. 执行筛选获取结果
const mCat1Result = filterByCategorySet(list, mCat1Set); const mCat2Result = filterByCategorySet(list, mCat2Set);
结果验证
执行后得到的结果与预期完全一致:
mCat1Result仅包含Église Saint-Julien对象(其categories.id包含300-3000-0025,匹配mCat1)mCat2Result包含Sevdec和SIEGE 27两个对象(它们的categories.id均为700-7600-0322,匹配mCat2)
性能说明
- 对于大数据集,Set的O(1)查找相比数组O(n)查找,时间复杂度从
O(M*N*K)(M为list长度,N为每个对象的categories数量,K为mCat数组长度)降低到O(M*N),性能提升显著。 filter和some都是原生数组方法,底层实现经过高度优化,比手动循环更高效。
内容的提问来源于stack exchange,提问作者JK2018
相关产品推荐
相关产品推荐

