2015-05-25 79 views
1

目的DIFF的陣列(在不修改原有的陣列)

我想突出兩個陣列之間的dfferences。請注意,arr1和arr2的長度會有所不同,並有多種類型(字符串和數字)。

我的代碼

function diff(arr1, arr2) { 
    var diffArr = []; 

    if (arr1.length >= arr2.length) { 
    for (var i = 0; i < arr1.length; i++){ 
     if (arr2.indexOf(arr1[i]) < 0) { 
      diffArr.push(arr1[i]); 
      } 
    } 
    } else { 
    for (var j = 0; j < arr2.length; j++){ 
     if (arr1.indexOf(arr2[j]) < 0) { 
     diffArr.push(arr2[j]); 
     } 
    } 
    } 
    return diffArr; 
} 

問題

diff([1, 2, 'cat', 'fish'], [1, 2, 3,'dog']); //returns only ['cat', 'fish'] 

我敢肯定,我的代碼僅返回副本中通過diffArr.push一個陣列(即使兩個陣列都有獨特的值)。但是,我不確定如何克服這一點。

我引用

Removes Duplicates from Javascript Arrays

Removed Duplicates from an Array Quickly

Javascript Array Difference

+0

@Donal我不認爲這是真的 - 的indexOf()可用於陣列(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) – jonplaca

回答

2

你的代碼目前只爬行通過一個數組(姑且稱之爲A),並在所有的A值推說在B中不存在。你從不以另一種方式去推入A中不存在的B值。有一個也不需要根據哪個數組更長而具有不同的行爲。這裏是一個簡單的方法,最後的答案:

function diff(arr1, arr2) { 
    var diffArr = []; 
    for (var i = 0; i < arr1.length; i++) { 
    if (arr2.indexOf(arr1[i]) < 0) diffArr.push(arr1[i]); 
    } 
    for (var j = 0; j < arr2.length; j++) { 
    if (arr1.indexOf(arr2[j]) < 0) diffArr.push(arr2[j]); 
    } 
    return diffArr; 
} 

而且在一個稍微功能的方法:

function diff(arr1, arr2) { 
    var elsIn1Not2 = arr1.filter(function(el){ return arr2.indexOf(el) < 0; }); 
    var elsIn2Not1 = arr2.filter(function(el){ return arr1.indexOf(el) < 0; }); 
    return elsIn1Not2.concat(elsIn2Not1); 
} 

兩個函數將返回[ 'cat', 'fish', 3, 'dog' ]您的例子。

+0

謝謝你 - 我一直在努力開發更多功能的編程方式。我在使用.filter()時遇到了麻煩(MDN示例並不好)。 Upvoted並標爲正確答案! – jonplaca

+0

謝謝。 :-)如果你想簡明扼要,你可以把'return arr2.indexOf(el)<0;'改成'return!〜arr2.indexOf(el'。;-)這可能只是唯一的主流用途'〜'運算符的位置(按位不)... –

0
function diff(arr1, arr2) { 
    var diffArr = {}; 

    if (arr1.length >= arr2.length) { 
    for (var i = 0; i < arr1.length; i++){ 
     if (arr2.indexOf(arr1[i]) < 0) { 
      diffArr[arr1[i]] = 1; 
      } 
    } 
    } else { 
    for (var j = 0; j < arr2.length; j++){ 
     if (arr1.indexOf(arr2[j]) < 0) { 
     diffArr[arr2[j]] = 2; 
     } 
    } 
    } 
    return diffArr.keys(); 
} 
+0

這並不能解決作者的問題,它似乎是「我怎樣才能得到兩個數組不共享的所有元素的數組」。如果你保留這個if-else,那麼你只會得到一個單向差異。 –