JavaScript で数値をソートするときの注意
JavaScript 界隈では常識だと思うんですが、知らなかったので覚書。
配列のソート行う Array.prototype.sort()
関数は、
compareFunction (比較関数) が与えられなかった場合、要素はそれぞれの文字列に変換したものを比較して辞書 (あるいは電話帳。数的でない) 順にソートされます。例えば、"80" は辞書順では "9" の前に来ますが、数的なソートでは 9 が 80 の前に来ます 。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
と、いうような実装になっています。
なので、例えば数値の配列をソートする場合、
const data = [3, 10, 1, 20, 22, 2, 15] console.log(data.sort()); // => [ 1, 10, 15, 2, 20, 22, 3 ]
のように『文字列として』ソートされた結果になります。
もし、どうしても数値としてソートしたい場合は
// 比較関数は a > b ならプラス値、a < b ならマイナス値を返す data.sort((a, b) => a - b) // => [ 1, 2, 3, 10, 15, 20, 22 ]
のように比較関数を指定することで回避することは出来ます。