2017-04-15 7 views
0

JavaScriptで、私は2つ以上のキーでdicsのリストをソートしようとしていましたが、問題がありました。ソート後javascript:複数の(2つ以上の)キーでdictsのリストをソート

hits = [ 
    {'key1': 'c', 'key2': 'c1', 'key3': 10}, 
    {'key1': 'a', 'key2': 'c1', 'key3': 10}, 
    {'key1': 'b', 'key2': 'c1', 'key3': 10} 
    ] 

//sorting by two keys 
hits.sort(function(a,b) { 
     return a.key2 != b.key2? (a.key2 < b.key2? -1 : 1) : 
a.key3 - b.key3 }); 

、ヒット[0]キー1は、まだ「C」である、と私はそれが私が第三でソートしなければならない意味の「A」、なりたいです。

PS:key2とkey3の値は同じで、私の実際のdicsのリストには、key2とkey3がこの例とは違う他のdicsがあるため、key1からまっすぐに並べ替えていません。 Pythonで

私は単にするだろう:

hits.sort(key=itemgetter('key2', 'key3',"key1")) 

それは小さなテストのために動作しますが、私は多くのDICSでリストをしようとすると、結果は意味がありません。ここで

は、データの一部です:

Key 2  Key3  key1 
chr1   11  chr1_K761 
chr1   11  chr1_K892 
chr2   10  chr2 

関与する他のキーがあります。ここでは

Key 2  Key3  key1 
chr1   11  chr1_K892 
chr1   11  chr1_K761 
chr2   10  chr2 

は、それが

Key 2  Key3  key1 
chr2   10  chr2 
chr1   11  chr1_K892 
chr1   11  chr1_K761 

をソートした後、私はそれがあるべきだと思うどのように見えるかです私は3つのキーで注文しているので、私は思っています

働いたソリューション:

 hits.sort(function(a, b) { 
      if(a.key2 < b.key2) 
       return -1; 
      if(a.key2 > b.key2) 
       return 1; 
      if(a.key3 < b.key3) 
       return -1; 
      if(a.key3 > b.key3) 
       return 1; 
      if(a.key1 < b.key1) 
       return -1; 
      if(a.key1 > b.key1) 
       return 1; 

      return 0; 
     }); 

答えて

1

あなたのコードの状態をkey2の値に基づいて昇順にソートします。両方のオブジェクトのkey2の値が同じ場合は、key3 key1に基づいてソートされますが、コードではまったく参照されません。 あなたがkeyに基づいて昇順にソートしたい場合は、あなたが行うことができます:

hits = [ 
    {'key1': 'c', 'key2': 'c1', 'key3': 10}, 
    {'key1': 'a', 'key2': 'c1', 'key3': 10}, 
    {'key1': 'b', 'key2': 'c1', 'key3': 10} 
]; 
hits.sort(function (a, b) { 
    return a.key1!=b.key1 ? (a.key1 < b.key1 ? -1 : 1) : 0; 
}); 

それとも、あなたがKEY2、KEY3、その後、キー1に基づいてソートする場合は、あなたが使用することを:

hits = [ 
    {'key1': 'c', 'key2': 'c1', 'key3': 10}, 
    {'key1': 'a', 'key2': 'c1', 'key3': 10}, 
    {'key1': 'b', 'key2': 'c1', 'key3': 10} 
]; 
hits.sort(function (a, b) { 
    return a.key2 != b.key2 ? a.key2 > b.key2 : (a.key3 != b.key3 ? a.key3 > b.key3 : (a.key1 != b.key1 ? a.key1 > b.key1 : 0)); 
}); 

これはあなたの目的に役立ちますか?

+0

それは3 dicsの小さなリストのために働いたが、私は多くのキーとdicsで私の実際のケースで試したとき、それは動作しませんでした。私は最初の投稿に詳しい説明を追加しました – user3780518

+0

'>'を '<'に変換しましたか?この最後のコードスニペットを同じ入力で実行すると、更新したと思われるシナリオが得られます。 –

関連する問題