Suite à cette discussion, j'ai codé (rapidement) un prototype permettant de comparer l'égalité de deux tableaux :
Le prototype compare : les valeurs simples du tableau (donc en gros, les chaines, nombres et booléens) ainsi que les valeurs de type tableaux (et ce quel que soit le niveau d'imbrication).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Array.prototype.isEqual = function(val){ if(!val.join){return false;} if(this.length != val.length){return false;} var long = val.length; for(var i = 0; i < long; i++){ if(val[i].join && this[i].join){ if(!this[i].isEqual(val[i])){ return false; } } else if(this[i] != val[i]){ return false; } } return true; }
En revanche, si le tableau contient d'autres objets complexes que des tableaux (objets, fonctions, regexp, ...), la fonction renverra false.
Enfin, il est possible d'améliorer le code (si vous vous le sentez ) en utilisant la méthode forEach() récemment apparue dans toute une floppée de méthodes utilitaires sur les tableaux. Cela améliorera les performances (qui doivent actuellement être médiocres sur de grosses imbrications) mais nécessitent un double codage pour les navigateurs n'implémentant pas forEach().
Exemples d'utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 alert([1,2,3].isEqual([1,2,4])); alert([1,2,3].isEqual([1,2,3])); alert([1,['a','b','c'],2].isEqual([1,['a','b'],2])); alert([1,['a','b','c'],2].isEqual([1,['a','b','c'],2]));
Partager