2010-09-24 10 views
12

de Possible en double:
Object comparison in JavaScriptComparaison des objets javascript natif avec jQuery

J'ai deux objets JavaScript natifs:

var foo = { hello: 'world', holy: { shit: 'batman' } }; 
var bar = { ... }; 

Je voudrais comparer les deux (foo == bar).

+3

+1 pour les noms de propriété –

+0

En effet! Je l'ai réparé. –

+0

Il y a une discussion à ce sujet ici: [http://stackoverflow.com/questions/1068834/object-comparison-in-javascript](http://stackoverflow.com/questions/1068834/object-comparison-in-javascript – fehays

Répondre

1

jQuery n'a pas d'utilitaire intégré pour comparer des objets. Ce n'est pas vraiment clair à partir de votre message quelles informations vous voulez tirer de vos deux objets. Est-ce que vous essayez de les trier? En fonction de ce que vous essayez de faire, vous pourrez peut-être satisfaire votre cas d'utilisation en utilisant l'une des méthodes utilitaires de jQuery. Voir, par exemple: jQuery.extend, jQuery.each, jQuery.map et jQuery.merge. jQuery est principalement concerné par la manipulation des éléments DOM; il n'a pas de fonction intégrée pour le tri de la liste (bien que vous puissiez trouver un plugin).

Vérifiez la documentation des services publics jQuery:

http://api.jquery.com/category/utilities/

Aussi, consultez array.sort(), qui est apparemment construit en javascript:

http://www.javascriptkit.com/javatutors/arraysort.shtml

6

Cela fonctionne bien, mais seulement dans certains cases:

var obj1 = {n1: "v1", n2: "v2"}, 
    obj2 = {n1: "v1", n2: "v2"}, 
    obj3 = {n2: "v2", n1: "v1"}, 
    obj4 = {n2: "v2", n1: "v1", f: function(){}}; 


// this will work correctly: 
JSON.stringify(obj1) == JSON.stringify(obj2); //true 


// but this fails :(
JSON.stringify(obj2) == JSON.stringify(obj3); //false 


// and this :(
JSON.stringify(obj3) == JSON.stringify(obj4); //true 
+4

La comparaison d'objets avec 'JSON.stringify' ne fonctionnera que * parfois * car l'ordre des clés n'est pas bien défini. Les propriétés sont simplement itérées dans le même ordre dans cet exemple - et dans l'implémentation testée - mais ce comportement n'est pas défini et ne devrait pas être utilisé *. –

+0

Je pense que cette approche pourrait être modifiée (par exemple sérialiser l'objet avec des clés dans un ordre trié) pour résoudre le problème décrit par pst, n'est-ce pas? – iX3

+1

Abonné à @ user166390. Cette méthode fonctionne UNIQUEMENT si l'objet ne contient aucune fonction, aucun noeud DOM et que l'ordre des champs reste le même. Cela fonctionne lors de la comparaison de JSON à partir de certaines API. Mais, si vous comparez des objets créés par vous-même, pourquoi ne pas utiliser un identifiant unique? – Dan