Frage

Ich habe Probleme, die ein Array Sortier undefinierte Elemente umfassen (a sparse array) in IE7. Dies funktioniert gut in Safari und Firefox natürlich, und ich habe keine andere Versionen von Internet Explorer versucht, aber hier ist ein einfaches Beispiel.

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

Die alert () am Ende zeigt unerklärlich 0 2 3 4 5 1. Das undefinierte Element Entfernen aus dem Array sich richtig sortiert und die Warnungs shows 0 1 2 3 4 5.

Gibt es eine Möglichkeit zu arbeiten, um diesen in IE7 so dass ich zuverlässig sortieren Arrays, die nicht definierten Elemente enthalten? Mir ist es egal, wo die undefinierten Elemente so lange am Ende als die definierten Elemente korrekt sortiert werden.

War es hilfreich?

Lösung

Versuche for (loop in myArray) zu for (var loop=0; loop<myArray.length; loop++) Ändern:

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

bei Verwendung des for (x in object) der Gegenstände nicht zu sein in, um garantiert. Siehe auch Warum wird mit "for ... in" mit Array-Iteration eine schlechte Idee?

(Der obige Benachrichtigung erfassen 0 1 2 3 4 5 undefined)

EDIT: Undeleted - ich habe die oben getestet und es funktioniert :-P

Andere Tipps

Vielleicht können Sie Ihren Komparator ändern

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

Zu allererst Ihre Sortierfunktion ist falsch, wie es erwartet wird, zurückzukehren -1, 0 oder +1, keinen boolean Wert.
Verwenden Sie stattdessen

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

Aber nur, damit Sie wissen, dass Schleife von Ihnen geht, einen Fehler zu werfen, wenn sie versucht, die id Eigenschaft aus dem undefinierten Elemente zurückzukehren. Außerdem sollen Sie nie eine for..in Schleife zu iterieren über ein Array, verwendet entweder eine Schleife mit Inkrementieren Index oder einem umgekehrten, während ähnlichen

verwenden
var l = arr.length; 
while (l--) {
    ..
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top