Algoritmo de orden personalizado de Javascript de acuerdo a otra matriz

Tengo estos dos arrays

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

Necesito clasificar beenThere en el orden de refArray para fines de visualización, por lo que si beenThere , el resultado debería ser

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

¿Dónde puedo conseguir un algoritmo?

ya que los datos son cadenas y las cadenas no tienen comas, puede evitar toda iteración de territorio de usuario con un RegExp dynamic:

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

ese es bueno porque no necesita [] .indexOf (), por lo que funciona en navegadores más antiguos. puede usar otro delimitador además de la coma si los datos tienen comas, con algún código un poco más feo …

o, usando el filtro para la iteración, pero con un método nativo en lugar de una función de tierra de usuario:

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

Es probable que estos funcionen más rápido que indexOf (), pero la clasificación es una operación extraña, con muchas oportunidades para la optimización detrás de escena, por lo que los resultados pueden variar.

una manera más rápida es usar la matriz pre-ordenada como plantilla y limitar el trabajo indexOf () a una sola llamada indexOf () en los elementos del subconjunto, en lugar de las llamadas 2-indexOf () en todos los elementos.

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

Trate de usar indexOf :

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

Simplemente compare los índices de cada elemento en la refArray usando el método indexOf .

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