返回一个函数,根据输入参数调用对象的函数

时间:2017-08-07 11:18:17

标签: javascript

为了对包含自己的私有属性的私有对象数组进行排序,我需要调用它们的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);
  }
}

2 个答案:

答案 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);
}
}