两个阵列的差异

时间:2017-04-19 19:59:47

标签: javascript arrays

我有一个关于找到两个数组之间差异的快速问题。我找到了一大堆JavaScript代码,可以执行我想要的here并对其进行一些修改:

JS

function diffArray(arr1, arr2) {
  var newArr = [];
  var myArr = arr1.concat(arr2);

  newArr = myArr.filter(function(item){
     return arr2.indexOf(item) < 0 || arr1.indexOf(item) < 0;
  });

  return newArr;
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

但是,我不确定我是否真的了解过滤器功能在这里做了什么。任何人都可以给我一个明确的解释,说明这是如何工作的。

注意:我已经了解过滤功能的基础知识。我正在寻找这个过滤器的详细解释。

3 个答案:

答案 0 :(得分:4)

newArr = myArr.filter(function(item){
   return arr2.indexOf(item) < 0 || arr1.indexOf(item) < 0;
});

Array#filter函数从concat函数(包含arr1arr2数组中的每个元素)遍历新生成的数组的每个元素。

如果在某次迭代中满足arr2.indexOf(item) < 0arr1.indexOf(item) < 0条件中的至少一个条件(返回true),则Array#filter函数会过滤掉(返回)指定(实际迭代)的元素。

如果迭代元素都在arr1arr2中,indexOf函数将返回它的索引(高于0) - 条件将返回false(不小于0)。我们将收到false || false false,该元素将不会包含在包含唯一元素的newArr数组中。

如果给定的元素只在一个数组中(它在第二个数组中不存在 - 它的索引将返回-1 - 它将满足< 0条件) - 其中一个条件将返回true,因此两个条件将变为true || false true - 给定元素包含在newArr数组中。< / p>

答案 1 :(得分:0)

过滤器正在使用lambda来过滤列表。

这实质上意味着它执行{}之间的代码并返回符合条件的数组。你的标准是两个数组中项目的索引都大于0,这基本上只是在两个数组中都说明了。

您可以在此处阅读更多内容:https://www.w3schools.com/jsref/jsref_filter.asp

答案 2 :(得分:0)

简单的思考方式是过滤器功能在内部创建一个数组。 此内部数组的元素是在回调函数中传递条件的元素。这是可能的,因为这个决定在回调函数中一次只做一个元素。

条件arr2.indexOf(item)&lt; 0 || arr1.indexOf(item)&lt; 0只传递给元素4,因为那时arr1中不存在4。由于返回了true,因此在内部数组中添加了元素4。最终在newArr中返回4。