2011-08-04 141 views
1

我有兩個陣列對數組排序,主要包括像300倍的值:根據另一個陣列

var main = [ 182, 928, 192, 111, 493, 1100, 3 ] .. 

二次包括10個值,但每個值是一個數組:

var secondary = [{"id" : 3, "category" : "animals"}, {"id" : 111, "category" : "water"}] .. 

我的問題是,如何根據main array中的值,通過他的編號排序secondary array

+0

您將對象視爲數組。輔助應該是這樣的:var secondary = [{「id」:3,「category」:「animals」},{「id」:111,「category」:「water」}] – fusion

+0

我不知道JavaScript,所以我不能給你一個答案,但請澄清:你想按id的排序,還是按第一個數組中的值排序,或者你的意思是按照id中的順序第一個數組? – ymett

+0

@fusion - 你是對的。這不是一個對象,我的錯誤。 – Luis

回答

3

如果您按照提及的方式構造第二個數組,您可以使用以下代碼。 該解決方案使用indexOf,它可能不存在於所有瀏覽器中。 Mozilla爲indexOf here提供了一個實現。

var main = [ 182, 928, 192, 111, 493, 1100, 3 ]; 
var secondary = [{"id" : 3, "category" : "animals"}, {"id" : 111, "category" : "water"}]; 

secondary.sort(function(a, b) { 
    return main.indexOf(a["id"]) - main.indexOf(b["id"]); 
}); 
+0

請注意,每次比較調用'indexOf'都相當慢。 –

0

首先,創建某種倒排索引爲main陣列:

var main_map = {}; 
for(var i = main.length;i--;) { 
    main_map[main[i]] = i; 
} 

然後,你可以通過自定義排序功能sort[docs]這樣的:

secondary.sort(function(a, b) { 
    return main_map[a["id"]] - main_map[b["id"]]; 
}); 

或者,您可以爲secondary數組和循環創建倒排索引通過main陣列,但由於您的secondary陣列要小得多,所以效率會降低。