Codewars Array.diff JavaScript实现报错,基础测试不通过排查求助
问题原因
你代码里的核心错误是splice方法调用参数不正确:splice仅传入1个索引参数时,会删除从该索引开始到数组末尾的所有元素。你失败的测试用例中,a为[1,2],当j=0时匹配到b中的1,执行a.splice(0)会直接把1和2全部删除,最终返回空数组,和预期不符。
除此之外你的代码还有两个可优化/修正的点:
- 匹配到待删除元素后,不需要继续遍历b数组的剩余项,直接跳出内层循环即可,避免无意义的判断
- 嵌套循环的实现效率较低,当数组量级较大时性能差,可将b转成Set后直接单次遍历a完成筛选
修复后的代码(兼容原有写法)
function arrayDiff(a, b) { for (var j = 0; j < a.length; j++) { for (var i = 0; i < b.length; i++) { if(a[j] == b[i]) { a.splice(j, 1); // 增加第二个参数1,仅删除当前索引的单个元素 j--; break; // 匹配到后直接跳出内层循环 } } } return a; }
更简洁的高性能实现
该实现不会修改原数组,逻辑更清晰,时间复杂度更低:
function arrayDiff(a, b) { const excludeSet = new Set(b); return a.filter(item => !excludeSet.has(item)); }
内容的提问来源于stack exchange,提问作者jaclaw
相关产品推荐
相关产品推荐

