2017-04-19 37 views
1

我有一个关于找到两个阵列之间区别的快速问题。我发现的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

如果产品不在'arr2',检查它是否在'arr1'如果不是在'arr1'要么,返回false,否则返回true。 – adeneo

+0

谢谢!这开始变得更有意义。 –

+0

我不喜欢愚蠢的代码暗示“嘿看我输入了2个字符少”。它应该像'arr2.indexOf(item)> = 0 && arr1.indexOf(item)> = 0;' – Redu

回答

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阵列英寸

+1

谢谢!这正是我所期待的。 –

0

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

这基本上意味着,它执行的代码之间的{},并返回满足标准的阵列。您的标准是这两个数组中的项的索引大于0,这基本上只是说它在两个数组中。

,你可以在这里阅读更多:https://www.w3schools.com/jsref/jsref_filter.asp

0

认为这个简便的方法是,过滤功能在内部创建一个数组。 这个内部数组的元素是那些在回调函数中传递条件的元素。这是可能的,因为这个决定是在回调函数中一次做出一个元素。

条件arr2.indexOf(项目)< 0 || arr1.indexOf(item)< 0仅传递元素4,因为此时4不存在于arr1中。由于返回true,所以元素4被添加到内部数组中。最终4在newArr中返回。