2011-08-04 99 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阵列要小得多,所以效率会降低。