Javascript 的 "splice" 方法异常行为

Javascript's "splice" method strange behavior

我试图解决 "free code camp" 网站上的一些编程挑战,问题是找到多个数组之间的对称差异和 returning 提供的对称差异的数组数组。

例如以下数组:

[1, 2, 5], [2, 3, 5], [3, 4, 5]

应该return[1,4,5]

这就是我想出的:

function sym() {
  var final = [];
  var current_array = [];

  for (var i = 0; i < arguments.length; i++) {
    current_array = arguments[i];
    //ensures duplicates inside each array are removed first
    current_array = current_array.filter(function (element, index) {
      return current_array.indexOf(element) == index;
    });

    for (var j = 0, end = current_array.length; j < end; j++) {
      if(final.indexOf(current_array[j]) < 0)
        final.push(current_array[j]);
      else
        // for some reason "splice" isn't working properly..
        // final.splice(final.indexOf(current_array[j], 1));
        delete final[final.indexOf(current_array[j])];
    }
  }

  var final_2 = [];
  // Removing the empty slots caused by the "delete" keyword usage
  for (var m = 0; m < final.length; m++) {
    if(typeof final[m] !== 'undefined')
      final_2.push(final[m]);
  }
  return final_2;
}

在前面的逻辑中,我创建了一个名为 final 的数组,它应该包含在所有传递的数组中只存在一次的所有元素,首先我遍历arguments 参数在这里表示数组,对于每个数组,我循环遍历其元素并检查该元素是否存在于 final 数组中。如果它存在,我将它从 final 数组中删除,否则我将它推入数组。

这里的问题是,如果我使用上面代码中给出的拼接方法,它的行为会非常奇怪,例如对于以下数组

[1, 2, 3], [5, 2, 1, 4],结果应该是:[3, 5, 4]

当我使用这条线时

final.splice(final.indexOf(current_array[j], 1));

而不是

delete final[final.indexOf(current_array[j])];

和return最终数组它return这个[4]

这是每次迭代的数组值

轮 (0, 0): 1
轮 (0, 1): 1,2
轮 (0, 2): 1,2,3
轮 (1, 0): 1,2,3,5
轮 (1, 1): 1
轮(1, 2):
轮 (1, 3): 4

一旦到达数组中存在的元素,它就会删除从该元素开始直到数组末尾的所有元素。

我不确切地知道我是否遗漏了什么,我试图搜索任何类似的问题,但我想到的大部分是从该人正在循环的数组中删除元素的问题,并且因此缺少它的索引.. 在我的例子中,我试图修改的数组与我正在迭代的数组无关。 我也相信 splice 修改数组并 returns 删除的元素.. 如果我没有得到它请纠正我。

您错放了 ),更正如下:

final.splice( final.indexOf(current_array[j]), 1 );

附加说明:算法为第一个数组添加 5,为第二个数组删除它,并为第三个数组再次添加它(因为它不再存在于 final 中) ,导致 [1,4,5]。 对于奇数个参数,值被保留,对于偶数个,它被删除。

从所有数组中获取所有唯一值的更简单方法(如果这是意图),是计算出现次数并过滤单个出现次数:

function sym2() {
  var count = {};
  for ( var i in arguments ) {
    console.log("Processing ", i );
    for ( var k = 0; k < arguments[i].length; k ++)
      count[ arguments[i][k] ] = (count[ arguments[i][k] ]||0) + 1;    
  }
  var final = [];
  for ( var i in count )
    if ( count[i] == 1 )
      final.push( i );
  return final;
}
sym2([1, 2, 5], [2, 3, 5], [3, 4, 5]);

请注意,这将 return [1,4] 而不是 [1,4,5]