【问题标题】:Variable function name Javascript变量函数名 Javascript
【发布时间】:2010-06-08 10:57:26
【问题描述】:

我正在对数组进行排序:

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() 方法,或者我需要以某种方式将引用传递给正确的比较器?

【问题讨论】:

    标签: javascript function sorting metaprogramming


    【解决方案1】:

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

    function chooseComparator(field, order){ 
    
      return comparators[order+"_"+field+"_comparator"]; 
    
    }
    

    是的,您必须将一个函数对象传递给sort() 函数,仅仅一个名称是不够的

    【讨论】:

      【解决方案2】:

      实际上你可以创建一个闭包而不是编写几十个函数。假设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"));
      

      【讨论】:

        【解决方案3】:

        我会做这样的事情。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-11
          • 1970-01-01
          • 2019-07-22
          • 1970-01-01
          • 2016-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多