为了对包含其私有(private)属性的对象的私有(private)数组进行排序,我需要调用它们的 getter
来检索正确的值。
下面的代码可以工作——但是每次调用 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);
}
}
最佳答案
您可以在 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 语句也很快。
您还可以在sort
之外定义可能的value
函数,并只需通过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
...
}
关于javascript - 根据输入参数返回调用对象函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45545659/