过滤嵌套数组问题求助:为何数组过滤判断始终返回true?
问题原因及解决方法
你的判断条件始终返回true的核心问题是:Array.filter()返回的是数组,而JavaScript中空数组以外的所有数组都会被判定为真值。哪怕只有一个元素匹配,filter返回的非空数组都会让if条件成立;若完全没有匹配项,filter返回空数组,条件才会是false。你觉得始终返回true,大概率是当前测试的所有partner的products里都至少有一个id存在于porArr中。
不过更高效、更贴合你需求的写法应该用Array.some()——你只需要判断两个数组是否存在交集,不需要收集所有匹配元素:
// 把porArr提到循环外,避免重复计算 const porArr: number[] = active.map(a => a.externalProductId); partners?.forEach((e) => { const products = e.products.map(a => a.externalProductId); // 用some判断是否存在至少一个匹配项 if (products.some(item => porArr.includes(item))) { console.log(e); } else { console.log('bad'); } });
额外补充两个优化点:
- 把
porArr的生成移到循环外部,避免每次遍历partner都重复处理active数组,提升性能 - 若不需要生成新数组,用
forEach替代map更合适,因为map的核心目的是转换生成新数组,这里只是遍历执行逻辑
如果数组规模较大,还可以进一步优化查找效率:Array.includes()是O(n)时间复杂度,把porArr转成Set后,Set.has()是O(1):
const porSet = new Set(active.map(a => a.externalProductId)); partners?.forEach((e) => { const hasMatch = e.products.some(a => porSet.has(a.externalProductId)); if (hasMatch) { console.log(e); } else { console.log('bad'); } });
内容的提问来源于stack exchange,提问作者WhyMe
相关产品推荐
相关产品推荐

