简体   繁体   中英

Javascript custom sort algorithm according to another array

I have this two arrays

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

I need to sort beenThere on the order of refArray for display purpose, so if I sort beenThere , result should be,

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

Where can I get one algorithm.

a faster way is to use the pre-sorted array as a template, and limit the indexOf() work to a single indexOf() call on the sub-set items, instead of 2-indexOf() calls on all items.

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"]

Try to use indexOf :

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

Just compare the indices of each element in the refArray using indexOf method.

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

since the data are strings, and the strings don't have commas, you can avoid all user-land iteration with a dynamic 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"]

that one is nice in that it doesn't need [].indexOf(), so it works in older browsers. you can use another delimeter besides comma if the data has commas, with some slightly uglier code...

or, using filter for the iteration, but with a native method instead of a user-land function:

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"]

these would probably perform faster than indexOf(), but sorting is a weird operation, with lots of opportunity for behind-the-scenes optimization, so results may vary.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM