Wie sortieren Array mit undefined Elementen in IE7 JavaScript
-
04-10-2019 - |
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.
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
var l = arr.length;
while (l--) {
..
}