JavaScriptでオレオレnatsortを実装してみました
node.js の fs.readdir が返すファイルオーダーだと不都合があるので、natsort を書いてみました。
http://sourcefrog.net/projects/natsort/ と
http://d.hatena.ne.jp/noonworks/20091231/1262265351 を参考にしました。
function natsort(ary, // @arg StringArray: items. ["abc100", "abc1", "abc10"] ignoreCase) { // @arg Boolean(= false): true is case-insensitive // @ret StringArray: sorted items. ["abc1", "abc10", "abc100"] function num(s) { return isNaN(s) ? s.split("").map(function(v) { return v.charCodeAt(0); }) : [+s]; } return ary.sort(function(a, b) { var aa = Array.prototype.concat.apply([], (ignoreCase ? a.toLowerCase() : a).split(/(\d+)/).map(num)); var bb = Array.prototype.concat.apply([], (ignoreCase ? b.toLowerCase() : b).split(/(\d+)/).map(num)); var x = 0, y = 0, i = 0, iz = aa.length; for (; i < iz; ++i) { x = aa[i] || 0; y = bb[i] || 0; if (x !== y) { return x - y; } } return a.length - b.length; }); }
実行結果
本家とはソート結果が一部異なりますが、
その辺の仕様がよくわからなかったので、あまりこだわらないでおきます。
http://sourcefrog.net/projects/natsort/example-out.txt
Original
1-2
1-02
1-20
10-20
fred
jane
pic01
pic2
pic02
pic02a
pic3
pic4
pic 4 else
pic 5
pic05
pic 5
pic 5 something
pic 6
pic 7
pic100
pic100a
pic120
pic121
pic02000
tom
x2-g8
x2-y7
x2-y08
x8-y8
uupaa "1-2", "1-02", "1-20", "10-20", "fred", "jane", "pic01", "pic2", "pic02", "pic02a", "pic3", "pic4", "pic05", "pic 4 else", "pic 5", "pic 5 ", "pic 5 something", "pic 6", "pic 7", "pic100", "pic100a", "pic120", "pic121", "pic02000", "tom", "x2-g8", "x2-y7", "x2-y08", "x8-y8"
diff X X X
(ε・◇・)з o O ( 10分ほどで、サクッと書いたわりには実用的な気がするよ