「JavaScriptで自然順ソート」と検索したときに、下のサイトが検索として出てきたのだが、ライブラリとしてはどうも使いにくかった。
https://gist.github.com/think49/660141
mozillaでもsortの比較関数の与え方はあるが、自然順ソートの例があるわけではない。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
日本語で検索してもあまり出てこなかったけれど、ライブラリ自体は見つけたので使い方を日本語で書いておく。
https://github.com/bubkoo/natsort
<script src="https://cdn.jsdelivr.net/npm/natsort@latest/index.min.js"></script>
node.js用のnpmもある
nodeの場合はrequireをするがその他は同じ使い方になる。
var natsort = require('natsort');
数字と文字列が混ざっている一次元配列
数字と文字列が混ざっていても、整列される。sort()だけでは、変な並びになる。
var array=['10', 9, 2, '1', '4']
array.sort(natsort())
//["1", 2, "4", 9, "10"]
array.sort()
//["1", "10", 2, "4", 9]
数字だけの一次元配列
sort()だけでも数字の大きさを比較するのかと思ったが、辞書順に並んだ。
var array=[10, 9, 2, 1, 4]
array.sort(natsort())
// [1, 2, 4, 9, 10]
array.sort()
//[1, 10, 2, 4, 9]
多次元配列のソート
単純に自然順ソートをすると一列目の内容で整列される。列番号を指定して整列する場合も書いている。
var multi_array=[
[10,6,8],
[2,11,15],
[4,12,13],
];
multi_array.sort(natsort())
//[2, 11, 15]
//[4, 12, 13]
//[10, 6, 8]
multi_array.sort()
//[10, 6, 8]
//[2, 11, 15]
//[4, 12, 13]
var sorter = natsort();
multi_array.sort(function(a, b) {
return sorter(a[1], b[1]);
});
//[10, 6, 8]
//[2, 11, 15]
//[4, 12, 13]