高效筛选对象数组:保留ID匹配指定数组值的元素的最优方法
最高效的数组筛选实现方案
嘿,这个需求其实很常见,要做到最高效的话,核心思路是把数组的线性查找转换成集合的常数时间查找,具体步骤和原因如下:
为什么选这个方案?
如果直接写 arr2.filter(item => arr1.includes(item.id)),虽然代码简洁,但每次调用includes都会遍历整个arr1——当arr1和arr2的元素数量较多时,时间复杂度会达到O(m*n),性能会随着数据量增大急剧下降。而用Set的话,查找操作是O(1)的,整体时间复杂度能降到O(m+n),效率提升非常明显。
具体实现代码
var arr1 = [11, 12, 13]; var arr2 = [ { id: 11, name: "name 1" }, { id: 12, name: "name 2" }, { id: 13, name: "name 3" }, { id: 14, name: "name 4" }, ]; // 第一步:把arr1转换成Set,将线性查找优化为常数时间查找 const idSet = new Set(arr1); // 第二步:过滤arr2,只保留id在Set中的元素 var newArray = arr2.filter(item => idSet.has(item.id)); console.log(newArray); // 输出结果:[ { id: 11, name: "name 1" }, { id: 12, name: "name 2" }, { id: 13, name: "name 3" } ]
补充说明
- 如果你的数据量特别小(比如arr1只有几个元素),直接用
includes的写法也能凑合用,但一旦数据规模变大,Set的优势就立刻体现出来了。 - 这个方案不仅适用于数字id,字符串id同样适用,只要是可哈希的类型都没问题。
内容的提问来源于stack exchange,提问作者tako-sphynx
相关产品推荐
相关产品推荐

