小编典典

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

algorithm

我有这两个数组

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

beenThere为了显示目的,我需要按refArray的顺序进行排序,因此,如果我对sort进行排序beenThere,结果应该是,

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

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


阅读 269

收藏
2020-07-28

共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(),因此可以在较旧的浏览器中使用。如果数据有逗号,则可以使用除逗号以外的其他分隔符,并带有一些较丑陋的代码…

或者,使用过滤器进行迭代,但使用本机方法而不是用户界面函数:

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()快,但是排序是一个怪异的操作,为幕后优化提供了很多机会,因此结果可能会有所不同。

2020-07-28