开发者

Variable function name Javascript

开发者 https://www.devze.com 2023-01-02 12:08 出处:网络
I\'m sorting array: myArray.sort(comparators.some_comparator); and I have several comparator to choose from:

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, o开发者_开发问答2){
    ...
   }

   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?


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


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


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

精彩评论

暂无评论...
验证码 换一张
取 消