2010-04-01 9 views
6

Si j'ai deux tableaux associatifs, quelle serait la manière la plus efficace de faire un diff par rapport à leurs valeurs?Faire un "Diff" sur un tableau associatif en javascript/jQuery?

Par exemple, avec:

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

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

Comment pourrais-je vérifier un contre l'autre, de sorte que les éléments manquants ou supplémentaires sont le tableau de résultats. Dans ce cas, si je voulais comparer array1 dans les array2, il retournerait:

array3 = {shape: 'circle'} 

Alors que si je comparais array2 au sein array1, il renverrait:

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

Merci d'avance pour votre aide!

Répondre

7

Essayez ceci:

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

solution de RaYell est agréable mais, malheureusement, ne vous dira que les objets dans obj2 qui sont différents ou inexistants dans obj1, si nous avons besoin de connaître les deux côtés, obtenons toutes les clés et ensuite comparer. La fonction suivante renvoie un tableau associatif avec des valeurs de clé pour chaque objet. Oh ... pour être juste, je n'ai pas encore testé, mais ça devrait marcher.

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, et pendant que je reconnais que la première solution a répondu à la question initiale, je pense que la solution ci-dessus offre une autre approche que l'utilisateur initial pourrait trouver utile afin de ne pas avoir besoin de vérifier deux fois.

Questions connexes