优化array.filter函数中大量比较逻辑的迭代效率
嘿,我完全懂这种手动写一堆重复判断的痛苦——代码又长又难维护,改个属性都要改好几处。咱们来把这个逻辑优化得清爽又高效~
先拆解一下需求核心:我们需要从源对象数组里,挑出那些至少有一个指定属性的值,能匹配参考数组最后6项对应属性值的元素。下面是具体的优化方案,分基础版和通用版两种:
基础版(针对固定两个属性)
假设我们的源数组是sourceArray,参考数组是referenceArray,要匹配的两个属性是propA和propB:
// 第一步:提取参考数组的最后6项(如果数组不足6项,slice(-6)会自动取全部) const recentRefs = referenceArray.slice(-6); // 第二步:把最后6项的两个属性分别转成Set——Set的has()查找效率比数组includes()高得多 const targetPropA = new Set(recentRefs.map(item => item.propA)); const targetPropB = new Set(recentRefs.map(item => item.propB)); // 第三步:筛选源数组 const filteredItems = sourceArray.filter(item => { return targetPropA.has(item.propA) || targetPropB.has(item.propB); });
通用版(支持任意数量属性,更灵活)
如果以后可能要调整匹配的属性数量,或者想把逻辑复用,封装成函数会更方便:
function filterByRecentMatches(sourceArr, referenceArr, matchProps, takeLast = 6) { // 取参考数组的最后N项 const recentItems = referenceArr.slice(-takeLast); // 生成每个要匹配属性的Set集合 const propMatchSets = matchProps.reduce((sets, prop) => { sets[prop] = new Set(recentItems.map(item => item[prop])); return sets; }, {}); // 筛选源数组:只要有一个属性匹配对应集合的值就保留 return sourceArr.filter(item => { return matchProps.some(prop => propMatchSets[prop].has(item[prop])); }); } // 调用示例:比如匹配name和category两个属性 const result = filterByRecentMatches( yourSourceArray, yourReferenceArray, ['name', 'category'] );
为什么这比手动写优雅?
- 效率更高:用
Set做查找是O(1)时间复杂度,比数组includes()的O(n)快很多,数据量大的时候差异明显 - 无冗余:不用重复写多个
||判断,新增/修改匹配属性只需要调整数组参数 - 可读性强:逻辑拆分清晰,别人看代码一眼就能明白你要做什么
举个实际数据的例子,假设:
const source = [{id:1, name:"Alice", type:"fruit"}, {id:2, name:"Bob", type:"vegetable"}]; const reference = [{name:"Bob", type:"meat"}, {name:"Charlie", type:"fruit"}, {name:"Dave", type:"grain"}]; // 筛选结果会是id=1(type匹配fruit)和id=2(name匹配Bob)的元素 const filtered = filterByRecentMatches(source, reference, ['name', 'type']);
内容的提问来源于stack exchange,提问作者theJuls
相关产品推荐
相关产品推荐

