2017-04-15 48 views
0

在javascript中,我一直試圖通過兩個以上的鍵排序一個dics列表,但我遇到了問題。javascript:排序多個(超過2個)鍵字的列表

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] KEY1仍然爲「c」和我希望它是「一」,這意味着我將具有由第三排序。

PS:正如你所看到的key2和key3的值是一樣的,我不直接從key1排序,因爲在我真正的dics列表中有其他的dics,其中key2和key3看起來與這個例子不同。

在Python中,我只想做:

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

它適用於小試,但是當我試圖用許多DICS名單,結果沒有意義。

下面是部分數據:

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 

後,我覺得應該是:

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

有其他鍵,但他們不是一個問題,我認爲,因爲我正在通過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然後key1的排序,你可以使用:

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個小小的清單,但是當我嘗試使用很多按鍵和麥克風時,我的真實情況並不奏效。我添加了第一篇文章,更多解釋 – user3780518

+0

您是否將'>'反轉爲'<?因爲使用相同的輸入運行最後一個代碼片段會給我更新的預期場景。 –