2:00am, Writing code

Roughly coding. Posted from Berlin.

Javascriptで数値配列をソートする

Javascriptには標準でArray.sortおよびArray.reverseが実装されているのでお手軽にソートを実行できる。と思いきやこいつらは数値配列をソートする場合は意図しない結果となることがあるので注意が必要である。

Array.sortは文字列比較

JavascriptArray.sortはデフォルトだと「数値比較」ではなく「文字列比較」で実行される。つまり数値配列に対して素朴にArray.sortを実行すると以下のようになる。

const a = [1, 2, 10, 3, 11, 20, 12];
console.log(a.sort()); // [ 1, 10, 11, 12, 2, 20, 3 ] !!!????

期待する結果は[1, 2, 3, 10, 11, 12, 20]だが実行結果は1の後に10、11、12と続いている。これは各要素が文字列として比較されるためである。期待通りの結果を得るためには文字列比較ではなく数値比較を行う必要がある。

Array.sortで降順ソート

Array.sortではカスタムのComparator関数を引数に渡すことで独自の比較ロジックを実行することが出来る。今回は最もベーシックな降順/昇順ソートを試す。ちなみにここではComparatorとしてES6のArrow operatorを使って関数を定義している。

const a = [1, 2, 10, 3, 11, 20, 12];
console.log(a.sort((a, b) => b - a)); // [ 20, 12, 11, 10, 3, 2, 1 ]

Array.sortで昇順ソート

const a = [1, 2, 10, 3, 11, 20, 12];
console.log(a.sort((a, b) => a - b)); // [ 1, 2, 3, 10, 11, 12, 20 ]

なおJavascriptArray.sortは破壊的なソート1なので注意する。

参考

JavaScriptで配列をソートする - もやもやエンジニア

Array.prototype.sort() - JavaScript | MDN


  1. 配列自体の内容が変更される。