2016-07-25 7 views
2

私は過去2日間私の脳を壊して問題の解決策を見つけましたが、私はそれを理解できません。多次元配列を数値的および辞書的に並べ替えるjavascript

配列の配列を最初に数値的に並べ替えて辞書的に並べ替える必要があります。カスタム関数は最初のものを解決できますが、通常のarray.sort()は2番目のものを処理できます。しかし、私はそれらをどのように組み合わせるかを知りません。

私はこれと類似の配列を有する:

var arr = [ 
 
    [ '80', '1', '230' ], 
 
    [ '9', '1', '230' ], 
 
    [ 'Ken', '6', '100' ], 
 
    [ 'Dan', '2', '800' ], 
 
    [ 'Tom', '6', '500' ], 
 
    [ 'team10', '2', '222' ], 
 
    [ 'team9', '2', '222' ] 
 
    ];

この配列は、ARR [N]内の数値に応じて第一数値でソートされる必要がある最小の[1](最大)。同じarr [n] [1]値を持つ結果は、arr [n] [2](最大から最小)に従って数値順に並べる必要があります。そして、最終的に同じ値[n] [1]と[n] [2]の結果は、arr [n] [0]に基づいて辞書順に並べる必要があります。

私がこれまでに得ている最も遠いが、このアプローチである:

function sortArr() { 
 
     arr.sort(function(a,b) { 
 
      if (a[1] === b[1]) { 
 
       if (a[2] === b[2]) { 
 
        return b[0] < a[0]; 
 
       } 
 
       return a[2]-b[2]; 
 
      } 
 
      return b[1]-a[1] 
 
     }); 
 
    }

数値ソートはこれで動作しますが、辞書式ソートはしません。どんな助けもありがとう。

答えて

1

文字列にString#localeCompareという連鎖アプローチを使用することをお勧めします。

ソート順:インデックスで

  • 1 DESCインデックス2 DESCで
  • インデックス0
    • ないnummerical部ASC
    • nummerical部ASC

var arr = [[ '80', '1', '230' ], [ '9', '1', '230' ], [ 'Ken', '6', '100' ], [ 'Dan', '2', '800' ], [ 'Tom', '6', '500' ], [ 'team10', '2', '222' ], [ 'team9', '2', '222' ]]; 
 

 
arr.sort(function (a, b) { 
 
    var aa = a[0].split(/(\d+)/g), 
 
     bb = b[0].split(/(\d+)/g); 
 

 
    return b[1] - a[1] || 
 
     b[2] - a[2] || 
 
     aa[0].localeCompare(bb[0]) || aa[1] - bb[1]; 
 
}); 
 

 
console.log(arr);

+0

あなたのニーナをありがとうございます。同じ問題。元の配列のteam10とteam9を入れ替えてコードを実行すると、正しくソートされません。 – Falk

+0

これは、 '1 <9 'のために、数字を解析し、文字比較の代わりにそれらを比較しなければならないからです – nidomiro

関連する問題