JavaScript数组比较(filter实现)失效,求修正及回调优化方案
问题解答
原代码问题分析
你的思路方向是对的(通过嵌套循环检查元素是否同时存在于两个数组),但实现逻辑完全错误:
- 你在嵌套循环里调用
arrOne.filter(),每次判断arrOne[i] === arrTwo[j],但filter的回调参数arr是遍历arrOne的每个元素,这个条件相当于找arrOne中所有等于arrOne[i]的元素(也就是当前arrOne[i]本身),但大部分时候arrOne[i] !== arrTwo[j],此时filter返回空数组,你把这些空数组都push到sharedWord里,最终就得到一堆空数组组成的数组。 - 另外,你没有声明
i和j的作用域,会变成全局变量,这也是潜在问题。
用循环替代includes()的正确实现
核心逻辑:遍历第一个数组的每个元素,用内层循环检查该元素是否存在于第二个数组中,存在则加入结果数组:
const justCoolStuff = (arrOne, arrTwo) => { const sharedWord = []; // 遍历第一个数组的每个元素 for (let i = 0; i < arrOne.length; i++) { const currentItem = arrOne[i]; let isExist = false; // 内层循环检查是否在第二个数组中 for (let j = 0; j < arrTwo.length; j++) { if (currentItem === arrTwo[j]) { isExist = true; break; // 找到后就跳出内层循环,不用继续检查 } } if (isExist) { sharedWord.push(currentItem); } } return sharedWord; }; const coolStuff = ['gameboys', 'skateboards', 'backwards hats', 'fruit-by-the-foot', 'pogs', 'my room', 'temporary tattoos']; const myStuff = [ 'rules', 'fruit-by-the-foot', 'wedgies', 'sweaters', 'skateboards', 'family-night', 'my room', 'braces', 'the information superhighway']; console.log(justCoolStuff(myStuff, coolStuff)) // 输出:[ 'fruit-by-the-foot', 'skateboards', 'my room' ]
用回调函数实现更具可读性的代码
可以把“检查元素是否存在于数组”的逻辑抽成独立回调函数,结合filter()使用,代码更清晰:
// 抽离检查元素是否存在的回调函数 const isItemInArray = (item, arr) => { for (let i = 0; i < arr.length; i++) { if (item === arr[i]) { return true; } } return false; }; const justCoolStuff = (arrOne, arrTwo) => { // 用filter遍历arrOne,只保留在arrTwo中存在的元素 return arrOne.filter(item => isItemInArray(item, arrTwo)); }; const coolStuff = ['gameboys', 'skateboards', 'backwards hats', 'fruit-by-the-foot', 'pogs', 'my room', 'temporary tattoos']; const myStuff = [ 'rules', 'fruit-by-the-foot', 'wedgies', 'sweaters', 'skateboards', 'family-night', 'my room', 'braces', 'the information superhighway']; console.log(justCoolStuff(myStuff, coolStuff)) // 输出:[ 'fruit-by-the-foot', 'skateboards', 'my room' ]
如果想更简洁,也可以用some()方法(本质也是回调式的检查):
const justCoolStuff = (arrOne, arrTwo) => { return arrOne.filter(item => arrTwo.some(arrItem => arrItem === item)); }; // 测试代码同上,输出一致
内容的提问来源于stack exchange,提问作者NoobNob1
相关产品推荐
相关产品推荐

