Javascript根据另一个数组自定义排序算法

时间:2014-09-15 05:55:46

标签: javascript algorithm sorting

我有这两个数组

var refArray = ['India','Pakistan','Nepal','Bhutan','SreeLanka','Singapore','Thailand','China','Russia']
var beenThere = ['Russia','Bhutan','India']

我需要按照refArray的顺序对beenThere进行排序以便显示,所以如果我排序beenThere,结果应该是,

['India','Bhutan','Russia']

我在哪里可以获得一种算法。

4 个答案:

答案 0 :(得分:3)

更快的方法是使用预排序的数组作为模板,并将indexOf()工作限制为对子集项的单个indexOf()调用,而不是对所有项的2-indexOf()调用

var refArray = ['India','Pakistan','Nepal','Bhutan','SreeLanka','Singapore','Thailand','China','Russia']
var beenThere = ['Russia','Bhutan','India'];
function contains(a){return this.indexOf(a)!==-1; }
refArray.filter(contains, beenThere); // == ["India", "Bhutan", "Russia"]

答案 1 :(得分:2)

尝试使用indexOf

beenThere.sort(function(a, b) {
    return refArray.indexOf(a) - refArray.indexOf(b); 
}); // ['India','Bhutan','Russia']

答案 2 :(得分:2)

只需使用refArray方法比较indexOf中每个元素的索引。

beenThere.sort(function(a,b){
return refArray.indexOf(a)-refArray.indexOf(b);
})

答案 3 :(得分:1)

由于数据是字符串,并且字符串没有逗号,因此可以避免使用动态RegExp进行所有用户区迭代:

var refArray = ['India','Pakistan','Nepal','Bhutan','SreeLanka','Singapore','Thailand','China','Russia']
var beenThere = ['Russia','Bhutan','India'];


(","+refArray+",").match(RegExp(",("+beenThere.join("|")+"),","g")).join(",").split(/,+/).slice(1,-1); 
// ==  ["India", "Bhutan", "Russia"]

一个很好,因为它不需要[] .indexOf(),所以它适用于旧浏览器。如果数据有逗号,你可以使用除逗号之外的另一个分隔符,稍微有点丑陋的代码......

或者,使用过滤器进行迭代,但使用本机方法而不是user-land函数:

var refArray = ['India','Pakistan','Nepal','Bhutan','SreeLanka','Singapore','Thailand','China','Russia']
var beenThere = ['Russia','Bhutan','India'];

refArray.filter(/./.test, RegExp("("+beenThere.join("|")+")","g"));
// == ["India", "Bhutan", "Russia"]

这些可能比indexOf()执行得更快,但排序是一个奇怪的操作,有很多机会进行幕后优化,所以结果可能会有所不同。