Algorithme de tri personnalisé Javascript selon un autre tableau

J'ai deux matrices

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

J'ai besoin de trier là- beenThere sur l'ordre de refArray à des fins d'affichage, donc si je l'ai beenThere , le résultat devrait être,

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

Où puis-je obtenir un algorithme.

Puisque les données sont des chaînes et que les chaînes n'ont pas de virgules, vous pouvez éviter toute itération utilisateur-terre avec un RegExp dynamique:

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

Celui-ci est agréable car il n'a pas besoin [] .indexOf (), donc il fonctionne dans les anciens navigateurs. Vous pouvez utiliser un autre délimiteur en dehors de la virgule si les données ont des virgules, avec un code légèrement plus laid …

Ou, en utilisant un filtre pour l'itération, mais avec une méthode native au lieu d'une fonction utilisateur-terre:

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

Ceux-ci fonctionneraient probablement plus rapidement que indexOf (), mais le tri est une opération étrange, avec beaucoup d'opportunité pour l'optimisation derrière les scènes, de sorte que les résultats peuvent varier.

Un moyen plus rapide est d'utiliser le tableau pré-trié en tant que modèle et de limiter le travail indexOf () à un seul appel d'indexOf () sur les éléments de sous-ensemble, au lieu des appels à 2 indexOf () sur tous les éléments.

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

Essayez d'utiliser indexOf :

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

Il suffit de comparer les indices de chaque élément dans le refArray utilisant la méthode indexOf .

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