IE7 JavaScriptの未定義の要素で配列を並べ替える方法
-
04-10-2019 - |
質問
IE7の未定義の要素(スパースアレイ)を含む配列のソートを問題にしています。もちろん、これはSafariとFirefoxでうまく機能します。IEの他のバージョンを試したことはありませんが、簡単な例です。
<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>
Alert()は、端に不可解に表示されます0 2 3 4 5 1.アレイから未定義の要素を削除すると正しくソートされ、アラートは0 1 2 3 4 5を示します。
未定義の要素を含む配列を確実にソートできるように、IE7でこれを回避する方法はありますか?定義された要素が正しくソートされている限り、未定義の要素がどこに終わるかは気にしません。
解決
変更してみてください 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()
を使用する場合 for (x in object)
アイテムは整理されていないことは保証されていません。参照してください アレイイテレーションで「for ... in」を使用するのはなぜ悪い考えですか?
(上記のアラート 0 1 2 3 4 5 undefined
)
編集: 削除されていない - 上記をテストしました、そしてそれは動作します:P
他のヒント
たぶん、あなたはあなたのコンパレーターを変更することができます
myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; });
まず第一に、ソート機能は、ブール値ではなく-1、0、または+1を返すことが期待されるため、間違っています。
代わりにこれを使用してください
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));
})
しかし、あなたが知っているように、あなたのそのループは、 id
未定義の要素からのプロパティ。また、aを使用しないでください for..in
ループアレイを繰り返すには、インデックスをインデックスを増やしたループまたはこのような逆のループのいずれかを使用します
var l = arr.length;
while (l--) {
..
}