2010-08-25 8 views
3
var obj = { 
'51' : { 'name':'name1'},  
'66' : { 'name':'name2'},  
'58' : { 'name':'name3'} 
}; 
$(function() { 
    s = ''; 
    $.each(obj, function(k, v) { 
     s += ' '+k; 
    }); 
    alert(s); 
}); 

Dans IE et Firefox, il est 51 66 58, mais dans Opera et Chrome, il est 51 58 66 Pourquoi sorte Jquery.each() par clé dans l'opéra, le chrome? Que puis-je faire pour conserver la commande native?problème avec JSON

p.s si les clés du tableau est une chaîne, le résultat 51j 66j 58J peut-être l'opéra et essayer de chrome pour convertir les clés en entier où il est possible

var obj = { 
"51j" : { "name":"name1"},  
"66j" : { "name":"name2"},  
"58j" : { "name":"name3"} 
}; 
+0

clés d'objet de, et ils sont des chaînes quoi qu'il arrive. – Skilldrick

+0

il semble que l'opéra et le chrome ne le pensent pas. – ncs

+0

Dans JS, obj [1] et obj ['1'] sont équivalents. Cependant, comme déjà expliqué, l'ordre de for..in itération est laissé indéfini par la spécification. Les navigateurs peuvent retourner les valeurs dans n'importe quel ordre et se comporter "correctement" selon la spécification. Au fil du temps, la compatibilité avec le Web et les autres navigateurs a forcé l'ordre d'insertion la plupart du temps, mais ce n'est toujours pas fiable comme vous l'avez découvert. – hallvors

Répondre

9

JavaScript objets ne sont pas ordonnés. Il n'y a aucune garantie quant à l'ordre dans lequel les clés doivent sortir lorsque vous les bouclez et les moteurs JS sont libres de mettre en œuvre tous les systèmes de stockage et de récupération qu'ils aiment.

Si les questions d'ordre, utilisez un tableau: []

Cela peut contenir des objets:

[ 
    { 'foo' : '1234', 'bar' : '5678' }, 
    { 'foo' : 'abcd', 'bar' : 'qwer' }, 
    { 'foo' : 'ldng', 'bar' : 'plma' } 
] 
+0

Si je reçois par requête ajax? – ncs

+1

@ncsft: Si vous ne pouvez pas changer le 'JSON' vous devez le lire et le trier vous-même, avant le traitement. – jAndy