尝试删除出现在两个数组中的任何数字:

function diff(args) {

  var diff = [].concat.apply([],arguments).reduce(
    function(result, current) {

      console.log("result: " + result);
      console.log("current: " + current);
      console.log("result.indexOf(current): " + result.indexOf(current));

      return result.indexOf(current) === -1
      ? result.concat(current)
      : result.splice(result.indexOf(current), 1);
    }, []
  );
  console.log("diff: " + diff);
  return diff;
}

console.clear();
diff([1, 2, 3], [5, 2, 1, 4]);


但是,控制台指示:

Console was cleared
result:
current: 1
result.indexOf(current): -1
result: 1
current: 2
result.indexOf(current): -1
result: 1,2
current: 3
result.indexOf(current): -1
result: 1,2,3
current: 5
result.indexOf(current): -1
result: 1,2,3,5
current: 2
result.indexOf(current): 1
result: 2
current: 1
result.indexOf(current): -1
result: 2,1
current: 4
result.indexOf(current): -1
diff: 2,1,4


为什么slice语句会被忽略,而将结果var重置为当前var?

理想情况下,我认为第一次发现时的result.splice(result.indexOf(current),1)将导致:

1,3,5



2

最佳答案

Array#splice returns被删除的数组的切片,您正在将其分配给结果。

您应该使用Array#slice代替:



function diff(args) {

  var diff = [].concat.apply([], arguments).reduce(
    function(result, current) {

      console.log("result: " + result);
      console.log("current: " + current);
      console.log("result.indexOf(current): " + result.indexOf(current));

      var index = result.indexOf(current);

      return index === -1 ?
        result.concat(current) :
        result.slice(0, index).concat(result.slice(index + 1));
    }, []
  );
  console.log("diff: " + diff);
  return diff;
}

console.clear();
diff([1, 2, 3], [5, 2, 1, 4]);

09-10 05:11
查看更多