2013-05-13 55 views
8

擁有2個可能非常大的嵌套javascript數組。一個是當前的,另一個是這個數組的前一次迭代。該功能需要找出所有不同的元素,並根據任何變化採取行動。查找所有不同嵌套數組元素的Javascript最佳實踐

我知道如何做一個功能來做到這一點,我想知道最佳實踐是做什麼的。任何好的建議將不勝感激。我正在尋找使用jQuery原生JavaScript處理對不同元素的響應。

這個問題涉及幾件事情。

  1. 什麼是比較對象的最有效的方式。在javascript檢查中,通過if,如果一個對象等於或不等於另一個對象,即使它們相等,也總是會說它不。因此需要對物體進行分解和比較。

  2. 返回結果的最佳方法是什麼?你是否有一些差異?在通過第一個數組的時候,你是否清除了與第一個數組相同的對象,或者創建一個全新的數組?

+0

查看lodash庫是如何執行的.https://github.com/bestiejs/lodash – lucuma 2013-05-13 02:01:46

+0

不同的元素,就像它們在比較2時出現的順序不同一樣?或者我們看看2個數組總共包含什麼,與命令無關?也許你可以告訴我們你現在正在做什麼,然後你可以得到一些最佳實踐的意見。不幸的是,這個問題目前患有「不是真正的問題」綜合徵。 – Xotic750 2013-05-13 02:34:45

+0

重複[「什麼是使用Javascript數組計算一組差異的最快或最優雅的方式?」](http://stackoverflow.com/questions/1723168/what-is-the-fastest-or-most-elegant -way-to-compute-a-set-difference-using-javasc)和[「JavaScript數組差異」](http://stackoverflow.com/questions/1187518/javascript-array-difference)。 – 2013-05-13 05:35:03

回答

1
function CompareArrays(arr1, arr2){  
    for(var key in arr1){ 
     if(arr1[key] !== arr2[key]){ 
      // traverse into nested array 
      if(typeof(arr1[key]) == 'object' || typeof(arr2[key]) == 'object'){     
       CompareArrays(arr1[key], arr2[key]); 
      } 
     }else{ 
       delete arr2[key]; 
     } 
    } 
} 

var a1 = [1,2,3,["a","b","c"],4,5,6,["d","e","f"]]; 
var a2 = [1,2,5445,["a","tt","c"],4,5,336,["d","edee","ffdf"], 'blablabla', 'I\'m extra']; 

CompareArrays(a1, a2); 
console.log(a2); 

這將着眼於給定的第二位。並修改它刪除任何共享相等的值。該數組仍然是完整的,但是現在任何相同的值都是未定義的。

0

就個人而言,我認爲遞歸是這種情況的一個很好的做法。

console.clear(); 
// Compare 2 nested arrays, do something if values don't match 
function CompareArrays(arr1, arr2){ 

    for(var i=0;i<arr1.length;i++){ 
     if(typeof arr1[i] === "object"){ 
      // traverse into nested array 
      CompareArrays(arr1[i], arr2[i]); 
     }else{ 
      if (arr1[i] != arr2[i]){ 
       // do something! 
       console.log("mismatch @ "+ i +" a1: "+arr1[i]+" a2: "+ arr2[i]); 
      } 
     } 
    } 
} 

var a1 = [1,2,3,["a","b","c"],4,5,6,["d","e","f"]]; 
var a2 = [1,2,55,["a","tt","c"],4,5,6,["d","e","f"]]; 

CompareArrays(a1, a2); 

工作小提琴:http://jsfiddle.net/ymSmP/5

+0

這假定a1中的所有鍵都將在a2中。而且a2不會有不同的鍵。 – Iscariot 2013-05-14 12:55:56

+0

當然是。你沒有說陣列也會有不同的大小。 – carrabino 2013-05-14 13:16:46