You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeWars Array.diff Kata 代码问题:我的实现为何部分用例失败?

Array.diff代码的问题分析与修复

你的代码核心问题是在遍历数组a时使用splice修改原数组,导致索引错位,跳过了相邻的重复元素。

举个典型的错误场景:当a = [2,2,2]、b = [2]时:

  1. 第一次循环j=0,发现a[0] === 2,执行splice(0,1),数组a变为[2,2]。
  2. 紧接着j自增到1,此时遍历的是新数组的a[1](即原数组的第三个2),删除后数组变为[2]。
  3. j继续自增到2,此时j >= a.length(2 >= 1),循环结束,最后剩下的一个2没有被删除,导致结果不符合预期。

修复方案1:修正索引错位

在删除元素后,将j减1,确保下一次循环能检查到被删除元素的下一个位置(现在的当前索引):

function arrayDiff(a, b) {
  for(let i = 0; i < b.length; i++){
    for(let j = 0; j < a.length; j++){
      if(b[i] === a[j]){
        a.splice(j, 1);
        j--; // 回退索引,避免跳过相邻元素
      }
    }
  }
  return a;
}

修复方案2:更高效简洁的实现(推荐)

利用filter方法结合Set的O(1)查找特性,既不修改原数组,又能大幅提升性能(尤其当b数组较大时):

function arrayDiff(a, b) {
  const bElements = new Set(b);
  return a.filter(item => !bElements.has(item));
}

这个逻辑很直观:遍历数组a,只保留不在bElements集合中的元素,完美符合题目要求的「保留原顺序、移除所有b中存在的元素」。


内容的提问来源于stack exchange,提问作者Emir Kaan Sarıçam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:40:31