質問

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--) {
    ..
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top