为了对包含自己的私有属性的私有对象数组进行排序,我需要调用它们的getters
来检索正确的值。
下面的代码有效 - 但每次调用value()函数时它都会通过切换。这是低效的,而不是一个优雅的解决方案。
如何在每次通话时返回不需要检查开关的功能?
旁注:使用eval
可以解决这个问题,但我宁愿找另一种方式。
const BY_X = 0;
const BY_Y = 1;
const BY_SUM = 2;
function EntryController() {
const entries = [/* ... */];
this.sort = function(sortType, order) {
const value = (entry) => {
switch (sortType) {
case BY_X:
return entry.getX();
case BY_Y:
return entry.getY();
case BY_SUM:
return entry.getX() + entry.getY();
default:
console.error("Unrecognized sortType: " + sortType);
return 0;
};
};
entries.sort((a, b) => value(a) > value(b) ^ order);
}
}
答案 0 :(得分:4)
你可以像这样在switch语句中创建一个函数。
const value = (() => {
switch (sortType) {
case BY_X:
return entry => entry.getX();
case BY_Y:
return entry => entry.getY();
case BY_SUM:
return entry => entry.getX() + entry.getY();
default:
console.error("Unrecognized sortType: " + sortType);
return () => 0;
};
}());
但我怀疑这会对整体表现产生重大影响。与函数调用相比,Switch语句更快。
您还可以在value
之外定义可能的sort
函数,然后只需sortType
获取一个函数。
const values = {
[BY_X]: entry => entry.getX(),
[BY_Y]: entry => entry.getY(),
...
}
const unknownSortType = () => 0
然后
this.sort = function(sortType, order) {
const value = values[sortType] || unknownSortType
...
}
答案 1 :(得分:0)
将值switch
从价值逻辑中移除就足够了,因为每次sort
调用都会执行一次。
const BY_X = 0;
const BY_Y = 1;
const BY_SUM = 2;
function EntryController() {
const entries = [/* ... */];
this.sort = function(sortType, order) {
let method;
switch (sortType) {
case BY_X:
method = entries[0].getX; // or from prototype if you know the class
case BY_Y:
method = entries[0].getY; // // or from prototype if you know the class
case BY_SUM:
method = function(entry){ return entry.getX() + entry.getY(); };
default:
console.error("Unrecognized sortType: " + sortType);
return 0;
};
const value = (entry) => {
return method.apply(entry, entry);
};
entries.sort((a, b) => value(a) > value(b) ^ order);
}
}