2010-04-01 12 views
6

Se ho due array associativi, quale sarebbe il modo più efficiente di fare una diff contro i loro valori?Fare una "Diff" su una matrice associativa in javascript/jQuery?

Ad esempio, dato:

array1 = { 
    foreground: 'red', 
    shape: 'circle', 
    background: 'yellow' 
    }; 

    array2 = { 
    foreground: 'red', 
    shape: 'square', 
    angle: '90', 
    background: 'yellow' 
    }; 

Come dovrei controllare uno contro l'altro, in modo tale che gli articoli mancanti oulteriori sono la matrice risultante. In questo caso, se volevo confrontare array1 all'interno array2, che sarebbe tornato:

array3 = {shape: 'circle'} 

Mentre se ho confrontato array2 all'interno array1, che sarebbe tornato:

array3 = {shape: 'square', angle: '90'} 

Grazie in anticipo per il vostro aiuto!

risposta

7

Prova questo:

function diff(obj1, obj2) { 
    var result = {}; 
    $.each(obj1, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
      result[key] = value; 
     } 
    }); 

    return result; 
} 
1

soluzione RaYell è bello ma sfortunatamente ti dirò solo gli oggetti in obj2 che sono o diversi da o non esistenti in obj1, se abbiamo bisogno di conoscere entrambi i lati, prendiamo tutte le chiavi e poi confrontiamo. La seguente funzione restituirà un array associativo con valori chiave per ciascun oggetto. Oh ... per essere onesti, non ho ancora provato, ma questo dovrebbe funzionare.

var diff = function(obj1,obj2) { 
    var newObj = $.extend({},obj1,obj2); 
    var result = {}; 
    $.each(newObj, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || !obj1.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
     result[key] = [obj1[key],obj2[key]]; 
     } 
    }); 

    return result; 
} 

Oh, e mentre io riconosco che la prima soluzione ha risposto alla domanda iniziale, credo che la soluzione di cui sopra offre un altro approccio che l'utente iniziale potrebbe trovare utile, in modo da non richiedere il controllo due volte.

Problemi correlati