2017-04-19 41 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中返回。