Question

Je rencontre des problèmes de tri d'un tableau qui comprend des éléments indéfinis (un tableau creux) dans IE7. Cela fonctionne très bien dans Safari et Firefox bien sûr, et je n'ai pas essayé d'autres versions de IE, mais voici un exemple simple.

<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>

L'alerte () à la fin montre de façon inexplicable 0 2 3 4 5 1. Retrait de l'élément non défini à partir de la matrice trie correctement et les émissions d'alerte 0 1 2 3 4 5.

Y at-il un moyen de contourner ce IE7 afin que je puisse les tableaux qui comportent de manière fiable trier des éléments non définis? Je ne me soucie pas où les éléments non définis finissent aussi longtemps que les éléments définis sont triés correctement.

Était-ce utile?

La solution

Essayez de changer for (loop in myArray) à 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()

lorsque vous utilisez l'for (x in object) les éléments ne sont pas garantis dans dans l'ordre. Voir aussi Pourquoi utiliser « ... dans » avec tableau itération une mauvaise idée?

(ci-dessus alertes 0 1 2 3 4 5 undefined)

EDIT: non supprimées - je l'ai testé ci-dessus et il fonctionne :-P

Autres conseils

Peut-être que vous pouvez modifier votre comparateur

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

Tout d'abord, votre fonction de tri est erroné car il devrait revenir -1, 0 ou +1, pas une valeur booléenne.
Utilisez ce lieu

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));
})

Mais juste pour que vous le savez, cette boucle de la vôtre va lancer une erreur en essayant de retourner la propriété id de l'élément non défini. En outre, vous ne devez jamais utiliser une boucle de for..in itérer sur un tableau, utilisez soit une boucle avec un indice incrémenter ou un certain temps inverse comme celui-ci

var l = arr.length; 
while (l--) {
    ..
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top