配列を「自然順アルゴリズム」でソートします。
第一引数に指定された配列を自然順アルゴリズムでソートします。
/**
* 文字列中に含まれる数字の小さい順にソートする
*/
console.log(JSON.stringify(natsort(['rfc1.txt', 'rfc2086.txt', 'rfc822.txt']))); // ["rfc1.txt","rfc822.txt","rfc2086.txt"]
console.log(JSON.stringify(natsort(['x2-g8','x2-y7','x8-y8','x2-y08']))); // ["x2-g8","x2-y7","x2-y08","x8-y8"]
/**
* 一方の要素値がもう一方の要素値に前方一致する場合、文字列長の長い要素値を後ろに並べる
*/
console.log(JSON.stringify(natsort(['a','a2','a1a','a1b','a10','a0','a20','a1']))); // ["a","a0","a1","a1a","a1b","a2","a10","a20"]
/**
* 小数も比較できる
*/
console.log(JSON.stringify(natsort(['1.02','1.002','1.3','1.001','1.1','1.010']))); // ["1.001","1.002","1.010","1.02","1.1","1.3"]
破壊的にソートします。
var array = ['9.01', '13', '0256'];
natsort(array);
console.log(array); // ["9.01", "13", "0256"]
要素値が String
型でなかった場合、String
型に型変換してから比較ソートします。
var array = [
['a', 10], // ToString -> "a,10"
['b', 1], // ToString -> "b,1"
['110', 'test'], // ToString -> "110,test"
['a', 5], // ToString -> "a,5"
['b', '0718'], // ToString -> "b,0718"
['20', '02'] // ToString -> "20,02"
];
console.log(JSON.stringify(natsort(array))); // [["20","02"],["110","test"],["a",5],["a",10],["b",1],["b","0718"]
natsort()
は故意に汎用です。第一引数は配列である必要はなく、配列と同じプロパティを持つオブジェクトであれば、期待通りに動作します。
var object = {0:'rfc1.txt',1:'rfc2086.txt',2:'rfc822.txt',length:3};
console.log(JSON.stringify(natsort(object))); // {"0":"rfc1.txt","1":"rfc822.txt","2":"rfc2086.txt","length":3}
第二引数にコールバック関数を指定する事で、各々の要素の比較対象を変更する事が出来ます。
function convertfn (value) { // 配列の要素を受け取る
return value[1]; // 要素値となる配列オブジェクトの "1" プロパティを比較する
}
var array = [
['foo', '2175'],
['bar', 'a0123'],
['num', '100'],
['piyo', 'a3'],
['n', 'b456'],
['b', 'b03']
];
natsort(array, convertfn);
console.log(JSON.stringify(array)); // [["num","100"],["foo","2175"],["piyo","a3"],["bar","a0123"],["b","b03"],["n","b456"]]
natsort()
は基本的に、Array.prototype.sort
の仕様に倣っています。
Array.prototype.sort
は破壊的であり、故意に汎用です。