2010-06-08 6 views
0

Je suis tableau de tri:nom de la fonction variable Javascript

myArray.sort(comparators.some_comparator); 

et moi avons plusieurs comparateur choisir parmi:

comparators = { 

    asc_firstname_comparator : function(o1, o2){ 
    ... 
    } 

    desc_firstname_comparator : function(o1, o2){ 
    ... 
    } 

    etc... 
} 

Je veux écrire la fonction qui renvoie certains comparateur en fonction des données d'entrée. Il doit comprendre comparateur à partir des entrées de chaîne, quelque chose comme ceci:

function chooseComparator(field, order){ 

    return "comparators."+order+"_"+field+"_comparator"; 

} 

est-il donc possible de passer la chaîne que le nom de fonction sort() méthode ou je vais devoir passer référence à corriger comparateur en quelque sorte?

Répondre

4

utiliser la notation indice pour l'indexation de l'objet javascript (obj.prop est le même que obj["prop"], mais cette dernière façon, vous pouvez créer des noms de propriété dynamiquement):

function chooseComparator(field, order){ 

    return comparators[order+"_"+field+"_comparator"]; 

} 

et oui, vous devez passer un objet de fonction à la fonction sort(), juste un nom ne suffit pas

2

Je ferais quelque chose comme ça.

var comparators = { 
    asc_firstname_comparator : function(o1, o2){ ... } 
    desc_firstname_comparator : function(o1, o2){ ... } 
}; 

Array.prototype.customSort(comparatorName) { 
    this.sort(comparators[comparatorName]); 
} 

var myArray = [ ... ]; // define array 
myArray.customSort("asc_firstname_comparator"); 
3

En fait, vous pouvez créer une fermeture au lieu d'écrire des dizaines de fonctions. En supposant asc_firstname_comparator signifie "Trier par x.firstname",

function compareByProperty(field, order) { 
    return function (o1, o2) { 
     var retval; 
     if (o1[field] > o2[field]) 
     retval = 1; 
     else if (o1[field] < o2[field]) 
     retval = -1; 
     else 
     retval = 0; 
     if (order === "desc") 
     retval = -retval; 
     return retval; 
    } 
} 
... 
myArray.sort(compareByProperty("firstname", "asc")); 
Questions connexes