Имя переменной функции Javascript - PullRequest
0 голосов
/ 08 июня 2010

Я сортирую массив:

myArray.sort(comparators.some_comparator);

и у меня есть несколько компараторов на выбор:

comparators = {

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

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

   etc...
}

Я хочу написать функцию, которая возвращает определенный компаратор в зависимости от входных данных. Он должен вычислять компаратор из строковых входов, что-то вроде этого:

function chooseComparator(field, order){

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

}

Так можно ли передать только строку имени функции в метод sort() или мне нужно как-то передать ссылку на правильный компаратор?

Ответы [ 3 ]

4 голосов
/ 08 июня 2010

использовать индексную запись для индексации объекта javascript (obj.prop совпадает с obj["prop"], но последний способ позволяет динамически создавать имена свойств):

function chooseComparator(field, order){ 

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

}

и да, вы должны передать объект функции в функцию sort(), просто имени недостаточно

3 голосов
/ 08 июня 2010

На самом деле вы можете создать замыкание вместо написания десятков функций.Предполагая, asc_firstname_comparator означает «сортировать по 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"));
2 голосов
/ 08 июня 2010

Я бы сделал что-то подобное.

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");
...