变量函数名称Javascript

时间:2010-06-08 10:57:26

标签: javascript function sorting metaprogramming

我正在排序数组:

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 个答案:

答案 0 :(得分:4)

使用下标表示法来索引javascript对象(obj.propobj["prop"]相同,但后一种方式可以动态创建属性名称):

function chooseComparator(field, order){ 

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

}

是的,你必须将一个函数对象传递给sort()函数,只是名字不够

答案 1 :(得分: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"));

答案 2 :(得分: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");