2010-06-08 5 views
0

Я массив сортировка:имя переменной функции Javascript

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() метода или мне нужно передать ссылку, чтобы исправить компаратор каким-то образом?

ответ

4

использовать индекс обозначения для индексации объектов JavaScript (obj.prop такой же, как obj["prop"], но тот способ, которым Вы можете создавать имена свойств динамически):

function chooseComparator(field, order){ 

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

} 

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

2

Я бы сделал что-то вроде этого.

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

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