11747


2番目の数値が小さい順に、名前順でソートしたい。  
ファイラーのようにフォルダの後にファイルが並ぶ。

配列の1番目の値が名前です。  
二番目の値は0がフォルダ、1がファイルとして付けます。  
次のコードを実行すると2番目の値に沿ってソートはされますが、配列の内容によっては名前順にソートされません。

[code]

    var ary = [
        ['あ0', 0],
        ['b', 0],
        ['c.txt', 1],
        ['た', 0],
        ['e', 0],
        ['ぜ.txt', 1],
        ['a', 0],
        ['a.txt', 1],
        ['d', 0],
        ['あ', 0],
        ['c', 0],
        ['b.txt', 1],
    ];
    
    ary.sort(function(a, b) {
      return (a[1] - b[1]) || (a[0] > b[0]);
    });
    
    for (var i = 0; i < ary.length; i++) {
      console.log('%d: %s', ary[i][1], ary[i][0]);
    }
    
[/code]

次の配列に差し替えるとうまくソートできました。

[code]

    var ary = [
        ['あ0', 0],
        ['b', 0],
        ['c.txt', 1],
        ['た', 0],
        ['e', 0],
        ['ぜ.txt', 1],
        ['a', 0],
        // ['a.txt', 1],
        ['d', 0],
        ['あ', 0],
        ['c', 0],
        ['b.txt', 1],
    ];
    
[/code]

アドバイスお願いします。


CC BY-SA 3.0
2015-06-26T01:52:03.513
11746
2015-06-26T02:03:03.120
10022
question
javascript
二次元配列をソートしたい


[Array.prototype.sort()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)に渡している比較関数が間違っています。

[code]

    function(a, b) {
        return (a[1] - b[1]) || (a[0] > b[0]);
    }
    
[/code]

ですが、２番目の値は減算で整数が返されますが、１番目の値については大小比較でbool値が返されてしまいます。

[code]

    function(a, b) {
        return (a[1] - b[1]) || (a[0] > b[0] ? 1 : a[0] < b[0] ? -1 : 0);
    }
    
[/code]

等、条件に合った整数を返すべきです。


CC BY-SA 3.0
2015-06-26T02:03:03.120
11747
2015-06-26T02:03:03.120
4236
11746
answer