2017-08-11 46 views
1

我有一個名爲countKeys的字符串數組,其中包含的值與對象的鍵相對應,而該對象又包含一個整數。Javascript sort()使用參數作爲屬性選擇器進行比較會在Chrome上產生奇怪的結果

我試圖根據對象中的鍵值(count),用鍵(countKeys)對數組進行排序。

陣列與(string)鍵名:

var countKeys = ["0","6","8","10","12","13","14","17","18","19","22","27","30","35","39","48","50","51","55","58","61","66","76","88","94","107","108","109"]; 

對象一個整數,我試圖來比較:

var count = {"0":5,"6":1,"8":3,"10":3,"12":2,"13":3,"14":3,"17":3,"18":2,"19":2,"22":2,"27":1,"30":1,"35":1,"39":1,"48":1,"50":1,"51":2,"55":2,"58":2,"61":1,"66":1,"76":2,"88":1,"94":1,"107":1,"108":1,"109":1};

我用下面的排序功能:

countKeys.sort(function(a, b) { 
    return count[b] - count[a]; 
}); 

我期待以下結果爲countKeys:

["0","8","10","13","14","17","12","18","19","22","51","55","58","76","6","27","30","35","39","48","50","61","66","88","94","107","108","109"]

在Firefox和IE瀏覽器,這個工作,在Chrome但是,我得到意想不到的結果:

["0","10","13","14","17","8","76","12","19","22","51","55","58","18","6","48","50","109","27","30","61","66","35","88","94","107","108","39"]

我如何在Chrome相同的結果,我在其他瀏覽器上?

JSFIDDLE

+1

你的排序函數沒有指定如果值相等,它應該使用數組索引作爲次要排序。 [JS排序不穩定](https://stackoverflow.com/questions/3026281/array-sort-sorting-stability-in-different-browsers) – James

回答

2

它看起來像你想通過兩個屬性進行排序:在count(數值)在count(數字)

  1. 的關鍵

您目前只按價值排序,但由於每個瀏覽器都有差異nt分選穩定性(即是否要互換等於元素),你會得到不同的結果。排序方式這樣兩種性能:

countKeys.sort(function(a, b) { 
    return count[b] - count[a] || b - a; 
}); 

這樣,如果count[b] - count[a]0(即,值相等),則進入直接比較ab(即,密鑰)。