1

IE9 の並べ替え順序は、比較関数が返されるときに要素の順序を変更していることに気付きました0

見る:

var myarray=[
    {id:1,val:0},
    {id:2,val:0},
    {id:3,val:7},
    {id:4,val:41}
];
myarray.sort(function(a,b){return a.val - b.val});

for(var i in myarray)
{
    console.log(myarray[i].id);
}

Chrome、Firefox、Opera、および Safari の現在の安定バージョンでは、次の出力が得られました: 1 2 3 4.

IE7 と IE8 で同じ出力。

IE9 の出力は次のとおりです。2 1 3 4

なんで?それは正常ですか?

4

3 に答える 3

4

for...in数値プロパティを繰り返し処理しようとしている場合は、次の 2 つの理由から、配列に対して使用しないでください。

  • また、表示に追加されたメソッドとプロパティも取得Array.prototypeします。
  • ECMAScript 仕様では、反復順序は実装に依存するものとして定義されています。つまり、理論上は何でもかまいません。

両方の点がObjects にも当てはまります。実際、Chrome は最も一般的なブラウザの動作に準拠していないため、Chrome のバグ レポートで激しい議論が繰り広げられています。

于 2011-01-24T14:22:49.130 に答える
3

MDCから(強調鉱山):

compareFunction(a, b) が 0 を返す場合、a と b は互いに変更されませんが、すべての異なる要素に関して並べ替えられます。[注: ECMAscript 標準は、この動作を保証していません]したがって、すべてのブラウザ (たとえば、少なくとも 2003 年までさかのぼる Mozilla バージョン) がこれを尊重しているわけではありません。

私の経験では、これを正しく行えるのは Chrome/Firefox だけです。私にとっての Opera 11 の動作は .. よく定義されていません。

たとえば、並べ替えを使用してすべてのゼロを配列の先頭に移動します。

[1, 0, 3, 0, 5, 0, 2].sort(function (a, b) { return b === 0 && 1 || 0;});
  • クロム 10: [0, 0, 0, 1, 3, 5, 2]
  • Firefox 4: [0, 0, 0, 1, 3, 5, 2]
  • Opera 11: [0, 0, 0, 2, 1, 5, 3] <- 非ゼロの順序を維持しません
于 2011-01-24T14:10:36.373 に答える
2

並べ替え機能に基づいて、これらの要素は両方とも同等であり、それらがどの順序で表示されるかは問題ではありません。順序をそのままにしておくか、適切と思われる順序を切り替えるかはブラウザ次第です...どちらも保証です。

2 つが等しくない場合は、並べ替え関数が正しくないため、他の項目も考慮する必要があります。

于 2011-01-24T14:11:27.477 に答える