javascript ne sait pas comparer des variables aryay ou des objets ?
ou encoreCode:
1
2
3 var foo=[0,2] var bar=[0,2] alert(foo==bar)
Code:
1
2
3 var foo={} var bar={} alert(foo==bar)
Version imprimable
javascript ne sait pas comparer des variables aryay ou des objets ?
ou encoreCode:
1
2
3 var foo=[0,2] var bar=[0,2] alert(foo==bar)
Code:
1
2
3 var foo={} var bar={} alert(foo==bar)
Non comme en java (et d'autres surement) tes variables foo et bar ont pour la valeur des r�f�rences vers deux objets/tableaux diff�rents.
Pour faire ce que tu veux faire tu dois impl�menter une m�thode equals qui comparerait non les r�f�rences, mais les valeurs contenues dans la structure de donn�e.
Cette m�thode equals pouvant �tre r�cursive si ton objet/tableau contient d'autres objets/tableaux, et aussi g�rer le cas o� tu te trouverais dans une r�f�rence cyclique.
ben non, comparaison par r�f�rence...
[damned: I am grilled;]
Code:
1
2
3 for(i in foo){ if(bar[i]!=foo[i])alert("pas pareil") }
Pas vraiment :nono:Citation:
Envoy� par javatwister
[0, 1] serait sinon �gal � [2, 1, 0] :whistle:
mais non 8O
(ce me semble; m�me si j'ai pas affin�)
sachant qu'on traite des tableaux avec la m�me organisation; � la moindre diff�rence, tu peux demander un break;
??
foo[0] != bar[0]
([0,1])[0] != ([2,1,0])[0]
(0 != 2) -> BREAK
dans ce cas, �a fonctionne
par contre bien vu, dans le cas d'un objet (non array) si l'un des deux contient plus d'�l�ments que l'autre, la m�thode de javatwister ne fonctionnera pas si le plus petit est compar� au plus grand.
pour les array, �a fonctionnera dans tous les cas, car l'un des "i" sera "length".
ben apr�s on peut tester sur les arrays tri�s ou pas selon que l'on veuille une egalit� des indexes et des contenus ou juste du contenu ...
Willpower: j'avoue
SpaceFrog: j'avoue
:mrgreen:
Arf, oui, j'ai �t� un peu enthousiaste... :aie:Citation:
Envoy� par Willpower
Mais on aura bien
:PCode:[0, 1] == [0, 1, 2]
Ou alors, il faut ex�cuter deux fois le code : foo ?== bar puis bar ?== foo.
en testant length � la base, pas probl�me, je pense;
relis mon message. ;-)
dans le cas d'array, un "for(i in obj)" assignera succesivement au "i" tous les indices du tableau ainsi que la valeur "length"(il me semble) donc la longueur des array sera compar� et �a empechera ce genre d'erreur.
EDIT: oups, je retire ce que j'ai dis au sujet du length, apparement je me suis fourvoy�. il faut bien tester length en plus. :oops:
par contre pour les objets (non array), il faudra utiliser une solution comme propos�e ici :
http://stackoverflow.com/questions/1...-in-javascript
bien que je ne comprends pas pourquoi il compare les "function" sous forme de string au lieu de le g�rer comme le reste avec une comparaison normale. (sauf s'il veut inclure dans sa comparaison des fonctions similaires mais non-�gales en terme de signature/prototype).
et je ne comprend surtout pas pq il cr�e 3 boucles au lieu de 2 (la premi�re pouvant �tre include dans la seconde.)
pour les arrays on dirait que l'on peut utiliser .toString()
pour les json nonCode:
1
2
3 var foo=[0,1] var bar=[0,1] alert(foo.toString()==bar.toString())
oui Spaf, puisque l�, tu retrouves une comparaison par valeur (String...)
voici le code corrig� du lien que j'ai donn�e plus haut. (avec optimisation pour les arrays, sans plantage pour les objets dom, etc..)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Object.prototype.equals = function(x){ var p; if( typeof(x) != 'object' ) return false; if( (x.length || this.length) && (x.length !== this.length) ) return false; for(p in this) { if( typeof(x[p]) == 'undefined' ) return false; switch( typeof(this[p]) ){ case 'function': if( typeof(x[p]) == 'undefined' || this[p].toString() != x[p].toString() ) return false; break; case 'object': // array or object(no dom) with recurse if( !this[p].nodeType ){ if( !this[p].equals(x[p]) ) return false; break; } default: if (this[p] != x[p]) return false; } } if( typeof(x.length) == 'undefined' ) for(p in x) if( typeof (this[p]) == 'undefined' ) return false; return true; };
Je suis tr�s surpris que tu ouvres un topic pour une chose aussi simple que la comparaison d'objets en JS qui ne se fait que sur des r�f�rences. Alors que tu fais pleins de choses en JS � cot�.
Attention au toString(); �a ne fait que te retourner le tableau en string et du coup tu te retrouves avec une comparaison de types primitifs
Et attention justement � ne pas tester un tableau d'objet de cette mani�re, car sinon tu peux te retrouver avec des r�sultats de ce genre :
Car de chaque cot� on a : "[object Object],[object Object]" comme valeur.Code:
1
2
3 [{},{}].toString()==[{titi:"tata"},{tuto:1}].toString(); => true
Et si je me rappelle bien je crois que tu as d�j� �cris une m�thode de copie r�cursive, tu pourrais donc t'en servir pour tester l'�galit� de 2 objets :D
C'est juste pour relancer un troll... :aie:
Au d�part je suis tomb� sur un teste d'�galit� alert([]==[]) en bidouillant une sorte de empty() pour javascript.
Ensuite ma curiosit� m'a pouss� � vouloir comparer des arrays et des jsons, sans trier ni boucler, ni importer une lib.
Forc�ment le toString() masque les types, mais bon js et typage ...
Bon encore une fois je tentais de r�inventer le fil � couper l'eau ti�de ...
T'as raison ma poule! faut pas se laisser aller :ccool:Citation:
Envoy� par SpaceFrog