2012-03-23 25 views
5

Tengo un servicio web que devuelve una matriz de datos codificada JSON. Luego uso la función .each() de jQuery para iterar a través de esa matriz, pero en Firefox se itera mientras que en Chrome se itera.Cambiar para .each() en firefox y cromo

los datos que vienen sback del servicio web es:

{ 
    "data": { 
    "610": { 
     "id": "610", 
     "url": "a url 1", 
     "description": "XXX YYY", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "608": { 
     "id": "608", 
     "url": "a url 1", 
     "description": "ytttgffrr", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "607": { 
     "id": "607", 
     "url": "a url 3", 
     "description": "rtretert3", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "606": { 
     "id": "606", 
     "url": "a url 4", 
     "description": "xxxwwww", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    ... 
    } 
} 

Firefox va 610 -> 606, mientras que el cromo fors 606 -> 610

Cualquier idea por qué y qué puedo hacer al respecto ?

+0

relacionado quizás http://stackoverflow.com/questions/640745/google-chrome-javascript-associative-arrays-evaluated-out-se-nce –

+0

http://stackoverflow.com/questions/648139/is-the -order-of-fields-in-a-javascript-object-predictable-when-looping-through-t – Dogbert

Respuesta

7

Las propiedades en los objetos no tienen un orden inherente. La especificación ECMAScript no garantiza que las instrucciones for…in atraviesen el objeto por sus propiedades en orden alfabético. jQuery.each usa for…in debajo del cofre cuando se usa en objetos.

Si el pedido es importante para usted, utilice una matriz en lugar de un objeto.

+0

@Matt ¿Editó mi publicación solo para que pudiera eliminar su voto popular? De buen tono. –

0

La enumeración de propiedades no tiene ningún orden garantizado. Si desea enumerar las propiedades en un orden garantizado, coloque las propiedades del objeto en una matriz, ordénelas como espera y luego enumere sobre eso.

En ES5, puede hacer esto simplemente usando Object.keys();

var keys = Object.keys(yourObj).sort(); 

for (var i=0;i<keys.length;i++) { 
    // use yourObj[keys[i]]; guaranteed to be in the right order 
} 

Si no está utilizando una cuña HTML5 o no puede utilizar la Object.keys() polyfiller, un for in será suficiente;

var keys = []; 

for (var x in yourObj) { 
    yourObj.hasOwnProperty(x) && keys.push(x); 
} 

keys.sort(); 

for (var i=0;i<keys.length;i++) { 
    // use yourObj[keys[i]]; guaranteed to be in the right order 
} 

Por supuesto, la función sort() en el objeto Array le permite especificar una función de un orden personalizado. También puede usar reverse() para invertir el orden de las teclas.

Cuestiones relacionadas