1

カスタム比較機能を使用して配列をソートしようとしています。

比較関数は、2 つの特定の要素間の順序のみを考慮します。

以下の例では、ソート後に 'a' が 'b' の前に表示されると予想されますが、そうではありません。

var ar = ["b", "c", "d", "a"];

ar.sort(function(x, y) {
  if (x == 'a' && y == 'b') { return -1; }
  if (x == 'b' && y == 'a') { return 1; }
  return 0; // only the order between 'a' and 'b' matters.
});

console.log(ar);

// ar is still ["b", "c", "d", "a"];

では、なぜ「a」が「b」の前にないのでしょうか? 回避策はありますか?

4

3 に答える 3

4

リストの連続するペアでコンパレーターが呼び出されることを考えてみてください。

"b", "c" --> 0
"c", "d" --> 0
"d", "a" --> 0

コンパレーターはすべてのペアが等しいと言っているので、順序をまったく変更する必要はありません。

他の要素がどのような順序で表示されるかは気にしないので (これは正しいですか?)、コンパレーターに "a" が何よりも小さく、"b" が何よりも大きいと言わせます。

ar.sort(function(x, y) {
  if (x == 'a' || y == "b") { return -1; }
  if (x == 'b' || y == 'a') { return 1; }
  return 0; // only the order between 'a' and 'b' matters.
});
于 2012-07-19T01:32:33.593 に答える
0

Array.prototype.sort 関数を次のように考えてください...

Array.prototype.sort = function( sortFunc ){
    if( typeof sortFunc !== "function" ){
        sortFunc = function(a,b){
            return a-b;
        }
    }
    var arr = [];
    for(var i = 0, len = arr.length; i <= len; i++ ){
        sortFunc( arr[i], arr[i+1] );
    }
    return arr;
}

ご覧のとおり、関数には 1 単位だけ離れた要素Array.prototype.sortのみが提供されます。sortFunc

そのため、インデックスが 1 ユニット離れていないため、 sortFunc( "b", "a" ) は発生しません。

于 2012-07-19T01:41:31.577 に答える
0

もし'a' = 'c'、そして'b' = 'c'- あなたの関数によれば、それは'a'また に等しい'b'

于 2012-07-19T01:34:21.543 に答える