如何用现代ES6写法替代嵌套for循环实现属性匹配的数组过滤需求
最优实现方案
你原来的双层循环时间复杂度为O(n*m)(n、m分别为两个数组的长度),当数组规模较大时性能损耗会非常明显,最优方案可以通过Set数据结构 + 数组filter方法实现,整体时间复杂度降低到O(n+m):
const companions = [ {name:"camila", enrollmentId:1}, {name:"oscar", enrollmentId:2}, {name:"rupertina", enrollmentId:3} ]; const participants = [7,2,4]; // 先把目标id集合转成Set,查询时间复杂度为O(1) const participantSet = new Set(participants); // 直接过滤符合条件的对象即可 const finalResult = companions.filter(item => participantSet.has(item.enrollmentId)); console.log(finalResult) // 输出和原代码完全一致
方案优势
- 性能更高:Set的
has查询是常数时间复杂度,避免了嵌套循环的重复遍历,数据量越大性能优势越明显 - 代码更简洁语义化:
filter方法本身就是用来筛选符合条件的数组元素,可读性更强,不需要手动维护结果数组和循环计数器
小数据量可选简化方案
如果两个数组的长度都很小(均低于100条),也可以直接用Array.includes实现,代码更短,但时间复杂度仍为O(n*m),不适合大数据量场景:
const finalResult = companions.filter(item => participants.includes(item.enrollmentId));
内容的提问来源于stack exchange,提问作者Julio César Rodríguez Pereira
相关产品推荐
相关产品推荐

