2011-05-29 1 views
4

Possible en double:
Chrome and probably Opera sort object properties automaticallyobjets trie Chrome par clé

J'ai un code très simple:

var obj = {3:'a',2:'b',1:'c'}; 
console.log(obj); 

Dans Firefox 4.0.1, il retourne:

Object { 3="a", 2="b", 1="c"} 

Dans Chrome 11.0.696.71 il retourne:

Object { 1="c", 2="b", 3="a"} 

Comment puis-je exercer des pressions sur Chrome ne trie pas cet objet?

+1

Si vous le voulez Pour être dans un ordre spécial, utilisez deux tableaux, l'un contenant des clés et l'autre contenant des valeurs. – xavierm02

+1

@xavier: Non, un seul tableau est suffisant, en utilisant simplement des valeurs comme clés. –

Répondre

2

C'est un "bug"/une caractéristique connue du chrome. Même auteur de indignés jQuery de cela, mais les gars chrome rester inflexible, disant que c'est une « fonction »: http://code.google.com/p/chromium/issues/detail?id=883 [1]

En tant que l'utilisation de solution de contournement des tableaux ou une sorte de MixedCollection (comme dans ExtJS) ou quelque chose de similaire .

null !== true and also null !== false // in php and js it's so 

[1]: John Resig (jeresig) est un auteur de jquery

+4

-1 pour les développeurs de Chrome, l'ordre des propriétés de l'objet est et restera non spécifié; +1 pour la recommandation des tableaux. –

+0

Il n'était pas spécifié, mais tous les autres navigateurs l'implémentent déjà comme non ordonné. Donc, il est trop formel et rompt également le code plus ancien. Je pense que les développeurs de chrome étaient des burocrates - trop formels. – gaRex

+0

Je suis désolé, je ne comprends pas ce que vous dites: vous venez d'admettre que "tous les autres navigateurs l'implémentent déjà comme non ordonné"; Cela signifie simplement que vous ne devez pas compter sur l'ordre des propriétés. Le code basé sur ceci est simplement cassé. BTW, quel «ancien code» voulez-vous dire? –

4

pour les objets de la spécification est que l'ordre des éléments ne se conserve pas. En d'autres termes, javascript ne garantit aucun ordre particulier pour les propriétés d'un objet.

Vous devrez utiliser un tableau si vous voulez préserver l'ordre des éléments. Dans ce cas, votre objet peut être réécrite à:

var arrobj = ['c','b','a']; 

ou

var arrobj = ['a','b','c'].reverse(); 

Si vous avez prendre en compte que le premier indice d'élément sera 0 (zéro)

+0

Non. La numérotation des tableaux commence à '0'. Comme l'OP veut utiliser des clés spécifiques, il ferait mieux d'utiliser 'var arr [3] =" a ", arr [2] =" b ", arr [1] =" c ";' –

+0

Javascript n'a pas tableaux associatifs, il a des objets. – RobG

+0

@Marcel: Eh bien, il pourrait aussi utiliser ['-', 'c', 'b', 'a'] ou lors de l'itération à travers le tableau ajouter 1 à l'itérateur etc. Beaucoup de routes mènent à Rome ici. L'essentiel est: l'ordre des propriétés n'est pas conservé dans les objets javascript. @RobG: Je sais. Il semblait que le PO comprendrait mieux le terme «réseaux associatifs». Je l'ai laissé tomber. – KooiInc