Edited at

JavaScriptのソートを使うと9より80が先にくる

JSのソートについて調べる機会があったのですが、仕様を全然把握していなかったので、勉強がてらまとめました。


javascriptのソートについて

ソートについてArray.prototype.sort()をみてみると、どうやら数字ではなく文字列に変換したものを比較するらしい。


compareFunction (比較関数) が与えられなかった場合、要素はそれぞれの文字列に変換したものを比較して辞書 (あるいは電話帳。数的でない) 順にソートされます。例えば、"80" は辞書順では "9" の前に来ますが、数的なソートでは 9 が 80 の前に来ます。


そのため、8と90の配列をソートする結果が下記のようになる。

let array = [9, 80];

array.sort()
// (2) [80, 9]


数字としてソートしたい場合には?

公式からの引用ですが、これ1発でいけた!

function compareNumbers(a, b) {

return a - b;
}
numberArray.sort(compareNumbers);

// クロージャ使うパターン
var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers);
// [1, 2, 3, 4, 5]