Variable function name Javascript

谁都会走 提交于 2020-01-11 14:05:54

问题


I'm sorting array:

myArray.sort(comparators.some_comparator);

and I have several comparator to choose from:

comparators = {

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

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

   etc...
}

I want to write function which returns certain comparator depending on input data. It should figure out comparator from string inputs, something like this:

function chooseComparator(field, order){

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

}

So is it possible to pass only function name string to sort() method or I'll need to pass reference to correct comparator somehow?


回答1:


use the subscript notation for indexing the javascript object (obj.prop is the same as obj["prop"], but the latter way you can create property names dynamically):

function chooseComparator(field, order){ 

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

}

and yes, you have to pass a function object to the sort() function, just a name is not enough




回答2:


Actually you can create a closure instead of writing dozens of functions. Assuming asc_firstname_comparator means "sort by 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:


I'd do something like this.

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


来源:https://stackoverflow.com/questions/2996674/variable-function-name-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!