JavaScript比较两个数组生成新数组:匹配项留值不匹配补0实现问题
问题原因
- 你混淆了数组索引和数组元素两个概念:
- 循环变量
i是arrayOne的索引,并非arrayOne里存储的元素值 - 原有代码判断的是「索引i是否在arrayTwo中存在」,而非「arrayOne对应位置的元素值是否在arrayTwo中存在」
- 取值时用索引i去取arrayTwo的元素,arrayTwo长度远小于arrayOne,自然会出现
undefined
- 循环变量
修复方案
方案1:直接修改原有for循环
把判断和取值的对象替换为arrayOne[i]即可:
let newArray = []; for (let i=0; i < arrayOne.length; i++){ if(arrayTwo.includes(arrayOne[i])) { newArray.push(arrayOne[i]); } else { newArray.push(0); } }
方案2:更简洁的map写法(性能优化版)
如果数组长度较大,建议先把arrayTwo转成Set,Set.prototype.has的时间复杂度是O(1),比Array.prototype.includes的O(n)效率更高:
const twoSet = new Set(arrayTwo); const newArray = arrayOne.map(item => twoSet.has(item) ? item : 0);
两种写法都可以得到你期望的[0,0,3,4,5,0,0,8,9,10,11,12,13,14,15,16,0,0]结果。
内容的提问来源于stack exchange,提问作者Jacob Sherwood
相关产品推荐
相关产品推荐

