2014-09-15 3 views
1

Je ces deux tableauxJavascript algorithme de tri personnalisé selon un autre tableau

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

je dois trier beenThere l'ordre de tabRéfs à des fins d'affichage, donc si je sorte beenThere, le résultat devrait être,

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

Où puis-je obtenir un algorithme.

Répondre

1

puisque les données sont des chaînes et les chaînes n'ont pas de virgules, vous pouvez éviter toute itération l'espace utilisateur 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"] 

que l'on est bien en ce qu'elle doesn 't need [] .indexOf(), donc cela fonctionne dans les anciens navigateurs. vous pouvez utiliser un autre délimiteur en plus des virgules si les données contient une virgule, avec un code un peu plus laid ...

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

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

cela fonctionnerait probablement plus vite que indexOf(), mais le tri est une opération étrange, avec beaucoup d'opportunités d'optimisation en coulisses, donc les résultats peuvent varier.

2

Essayez d'utiliser indexOf:

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

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

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

un moyen plus rapide est d'utiliser le tableau pré-triés comme modèle, et limiter le indexOf() travailler à un seul indexOf() faire appel aux éléments sous-ensemble, au lieu de 2-indexOf() appelle 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"] 
+0

"* un moyen plus rapide ** est ***" - que quoi? Je pense que vous devez soutenir cela. ;-) – RobG

+1

+1 Pour une approche intéressante. – dfsq

+0

indexOf() est cher. Si vous exécutez indexOf() sur le grand tableau deux fois par itération, cela fait plus de travail et prend donc plus de temps que d'exécuter un indexOf() sur le plus petit tableau à chaque itération. cela sera particulièrement vrai là où indexOf() est polyfilled par le code user-land. – dandavis

Questions connexes