我正在排序数组:
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()
方法,或者我需要以某种方式将引用传递给正确的比较器?
答案 0 :(得分:4)
使用下标表示法来索引javascript对象(obj.prop
与obj["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");