2013-05-13 5 views
8

Con 2 array javascript annidati grandi, potenzialmente molto grandi. Uno è corrente e l'altro è l'iterazione precedente di questo array. La funzione dovrà trovare tutti gli elementi differenti e agire su qualsiasi cosa cambiata.JavaScript Best Practice per trovare tutti i diversi elementi di array annidati

So come fare una funzione per fare questo, mi chiedo quali sono le migliori pratiche per fare una cosa del genere. Qualsiasi buon consiglio sarà apprezzato. Sto guardando utilizzando JavaScript nativo con jQuery che gestisce le risposte ai diversi elementi.

Questa domanda riguarda diverse cose.

  1. Qual è il modo più efficiente per confrontare gli oggetti. Nel controllo javascript, se, se un oggetto è uguale o diverso da un altro oggetto, dirà sempre che non lo è, anche se sono uguali. Quindi gli oggetti devono essere suddivisi e confrontati.

  2. Qual è il modo migliore per restituire i risultati? Fai una serie di differenze? Mentre si procede verso il primo array, si eliminano gli oggetti uguali a quelli del primo o si esegue un array completamente nuovo da restituire?

+0

Scopri come la libreria lodash lo fa.https: //github.com/bestiejs/lodash – lucuma

+0

Elementi diversi, come in diversi nell'ordine in cui appaiono confrontando il 2? O stiamo osservando cosa contengono i 2 array in totale, irrilevante di ordine? Forse potresti mostrarci cosa stai facendo attualmente e quindi potresti ottenere alcune opinioni sulle migliori pratiche. Sfortunatamente questa domanda al momento soffre della sindrome "non una domanda reale". – Xotic750

+0

Duplicato di ["Qual è il modo più veloce o elegante per calcolare una differenza di set utilizzando gli array Javascript?"] (Http://stackoverflow.com/questions/1723168/what-is-the-fastest-or-most-elegant -way-to-compute-a-set-difference-using-javasc) e ["JavaScript array difference"] (http://stackoverflow.com/questions/1187518/javascript-array-difference). –

risposta

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); 

Questa esaminerà la seconda data. E modificarlo rimuovendo tutti i valori uguali condivisi. La matrice sarà ancora intatta ma tutti i valori che erano uguali ora non sono definiti.

0

Personalmente, penso che la ricorsione sia una buona pratica per questa situazione.

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); 

violino di lavoro: http://jsfiddle.net/ymSmP/5

+0

Ciò presuppone che tutte le chiavi in ​​a1 si troveranno in a2. E a2 non avrà chiavi diverse. – Iscariot

+0

sì certo. Non hai detto che anche gli array sarebbero di dimensioni diverse. – carrabino