2010-06-08 118 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"));