如何编写不会在首次返回false时终止的JS数组filter过滤函数
问题原因
你对filter的运行机制存在误解,同时代码逻辑有两处错误:
Array.filter不会在首次返回false时终止,它会遍历完所有待处理元素,仅保留回调返回值为true的项。- 回调内的
do-while循环在第一次执行时就会触发return语句,循环根本不会重复执行;此外你错误使用jobs数组的遍历索引i去读取filteredLocations的元素,两个数组长度不一致时会出现索引错位、越界问题:比如jobs第三个元素索引为2,而filteredLocations长度为2,有效索引只有0、1,读取filteredLocations[2]会得到undefined,比对自然不成立。
修复方案
不需要手写嵌套循环做逐位比对,直接判断当前职位的地点是否在筛选地点列表中即可:
const jobs = [ {id: 1, location: 'AA'}, {id: 2, location: 'BB'}, {id: 3, location: 'CC'}, ] const filteredLocations = ['AA', 'CC'] // 筛选逻辑:当前元素的location在筛选列表中就保留 const filteredJobs = jobs.filter(el => filteredLocations.includes(el.location))
运行后filteredJobs会返回id为1和3的两个对象,完全符合预期。
如果需要兼容不支持includes的老旧运行环境,可以替换为indexOf实现:
const filteredJobs = jobs.filter(function(el) { return filteredLocations.indexOf(el.location) !== -1 })
内容的提问来源于stack exchange,提问作者BPpoz
相关产品推荐
相关产品推荐

