JavaScript数组过滤:筛选fruit属性数组与目标数组有交集的对象项
原实现的核心偏差
- 语法层面错误:JS中对象的键值对使用冒号
:做分隔,原写法用等号=是非法语法,会直接触发代码运行报错,修正后的合法arr2结构为:
arr2 = [ { fruit: ["pineapple","banana"] }, { fruit: ["grapes","apple"] }, { fruit: ["apple","orange"] } ]
- 逻辑层面错位:原代码里的
let kFilter = arr1.map(itemY => { return itemY; })属于无意义冗余逻辑,相当于对arr1做了一次浅拷贝,得到的内容和原arr1完全一致,没有任何实际作用。后续的判断条件kFilter.includes(itemX.fruit)是在检查字符串数组里是否存在**等于itemX.fruit(本身是水果数组)**的元素,字符串和数组永远无法全等匹配,这个判断永远返回false,自然无法得到预期的筛选结果。
可落地的正确实现
需求本质是:筛选出arr2中,对象的fruit数组和arr1存在任意共同元素的项。
直接通过嵌套的数组判断逻辑即可实现,无需多余的中间映射变量:
let filteredK = arr2.filter(itemX => itemX.fruit.some(singleFruit => arr1.includes(singleFruit)) )
性能优化提示:如果arr1的元素规模较大,可以提前将arr1转为Set结构做存在性判断,把单轮检查的时间复杂度从O(n)降到O(1),减少大数组场景下的遍历开销:
const allowedFruit = new Set(arr1) let filteredK = arr2.filter(itemX => itemX.fruit.some(singleFruit => allowedFruit.has(singleFruit)) )
按照上述逻辑运行后,最终筛选得到的结果是arr2里的第一项(包含arr1元素banana)、第三项(包含arr1元素orange),第二项因为仅包含grapes、apple,和arr1无交集,会被过滤掉。
内容的提问来源于stack exchange,提问作者Massimo Ivaldi
相关产品推荐
相关产品推荐

