latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

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分ほどで、サクッと書いたわりには実用的な気がするよ