javascript - 根据输入参数返回调用对象函数的函数

标签 javascript

为了对包含其私有(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/

相关文章:

javascript - 在 React 中突出显示搜索到的文本

javascript - 如何缩短 jQuery 函数?

javascript - 如果页面上的窗口打开并且用户关闭窗口,则重新加载当前窗口?

javascript - C - 使用 libcurl 的 http post 请求

javascript - 从 Function 继承时调用的意外行为

javascript - 如何使用 Selenium 从 JavaScript 返回值?

javascript - 定位元素/div 的下一个实例

javascript - 为什么我的音频标签在硬编码时加载源代码,而不是在 Vue.js 提供时加载源代码?

javascript - 无法使用 getElementsByTagName 选择子元素

序列化 Groovy 映射到 JS 文字对象的 Javascript 解析