Chromeでの文字列配列ソートがおかしい

投稿者: Anonymous

Mac版Chrome(42.0.2311.135 64-bit)で、
自前の比較関数を用いて文字列配列のソートをすると変な結果になります。

以下から試せます。

_x000D_

_x000D_

var arr1 = ["hoge0", "piyo0", "fuga0", "fuga1", "fuga2", "fuga3", "fuga5", "fuga6", "fuga7", "fuga8"];_x000D_
var arr2 = ["hoge0", "piyo0", "fuga0", "fuga1", "fuga2", "fuga3", "fuga5", "fuga6", "fuga7", "fuga8", "fuga9"];_x000D_
var compare = function(a, b){_x000D_
  return a > b;_x000D_
};_x000D_
_x000D_
document.body.innerHTML += '1) ' + arr1.sort(compare).join(',') + '<br>';_x000D_
document.body.innerHTML += '2) ' + arr2.sort(compare).join(',') + '<br>';_x000D_
document.body.innerHTML += '3) ' + arr2.sort().join(',');

_x000D_

_x000D_

_x000D_

Firefoxなら2)と3)が同じ結果になるのですが、
Chromeで実際に実行すると以下の結果になります。2)が変です。

1) fuga0,fuga1,fuga2,fuga3,fuga5,fuga6,fuga7,fuga8,hoge0,piyo0
2) fuga3,fuga9,fuga0,fuga1,fuga2,fuga8,fuga5,fuga6,fuga7,hoge0,piyo0
3) fuga0,fuga1,fuga2,fuga3,fuga5,fuga6,fuga7,fuga8,fuga9,hoge0,piyo0

これはバグなのでしょうか?それともソートの仕方が間違っているのでしょうか?

解決

比較関数には

1つ目の引数が2つ目の引数よりも小さい場合は、負の値を返す。
2つの引数が等しい場合は0を返す。
1つ目の引数が2つ目の引数よりも大きい場合は、正の値を返す。

必要があります。
なので、示された比較関数は正確にはこの条件を満たしていません。
例えば、以下のようにする必要があります。
var compare = function(a,b){ return (a > b) - (a < b); };

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *