Pregunta

Tengo problemas para ordenar una matriz que incluye elementos no definidos (una matriz dispersa) en IE7. Esto funciona muy bien en Safari y Firefox, por supuesto, y no he probado otras versiones de IE, pero aquí es un ejemplo sencillo.

<html>
<head>
<script type="text/javascript">
function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (loop in myArray) {
        output += myArray[loop].id + ' ';
    }
    alert(output);
}
</script>
</head>
<body onLoad="runscript();">
</body>

La alerta () al final muestra inexplicablemente 0 2 3 4 5 1. Extracción del elemento indefinido a partir de la matriz ordena correctamente y los espectáculos de alerta 0 1 2 3 4 5.

¿Hay una manera de solucionar este problema en Internet Explorer 7 para que pueda ordenar matrices fiable que incluyen elementos no definidos? No me importa donde los elementos no definidos terminan siempre que los elementos definidos se clasifican correctamente.

¿Fue útil?

Solución

Intente cambiar for (loop in myArray) a for (var loop=0; loop<myArray.length; loop++):

function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (var loop=0; loop<myArray.length; loop++) {
        output += (myArray[loop]||{id: 'undefined'}).id + ' ';
    }
    alert(output);
}
runscript()

cuando se utiliza el for (x in object) los artículos no están garantizados para estar en el fin. Ver también ¿Por qué se utiliza "para ..." con arreglo iteración una mala idea?

(Lo anterior alertas 0 1 2 3 4 5 undefined)

EDIT: Se han recuperado - He probado lo anterior y funciona :-P

Otros consejos

Tal vez usted puede modificar su comparador

myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; });

En primer lugar, su función de clasificación es errónea, ya que se espera que regrese -1, 0 o 1, no es un valor booleano.
Utilice esta vez

var arr = [.....]
arr.sort((function(a, b){
    if (!a || !b) {
        // Here you choose how to treat undefined/null elements
        return 0;
    }  
    return (a[index].id === b[index].id ? 0 : (a[index].id < b[index].id ? -1 : 1));
})

Pero sólo para que sepa, ese bucle de los suyos va a lanzar un error al intentar devolver la propiedad id del elemento no definido. Además, nunca se debe utilizar un bucle for..in para iterar sobre una matriz, o bien el uso de un bucle con el índice de incremento o un tiempo atrás como esto

var l = arr.length; 
while (l--) {
    ..
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top