0

我正在尝试将此代码块转换为 Lo-Dash:

if(!event && callback){
  for(var ev in this._events){
    for (var i = 0; i < this._events[ev].length; i++) {
      if(this._events[ev][i].callback === callback){
        this._events[ev].splice(i, 1);
      }
    }
  }
  return;
}

我已经尝试过了,但我无法让它工作:

if(!event && callback){
  _.each(this._events, function(ev){
    _.each(ev, function(trigger, i, ev){
      if(trigger.callback === callback) ev.splice(i, 1);
    });
  });
  return;
}

this._events结构是这样的:

this._events = {
  ev1: [
    {callback: functions(){....}},
    {callback: functions(){....}}
  ],
  ev2....
}
4

1 回答 1

0

我不相信转换有任何直接问题,但原始代码似乎有缺陷 - 如果您尝试删除两个连续的函数,则只会删除第一个函数。每次删除某些内容时,都会跳过列表中的以下项目(您必须更聪明地使用索引才能使其工作,除非您出于任何原因对检查回调匹配后的项目无动于衷)。这可以通过对原始代码执行以下操作来解决:

if (!event && callback) {
  for (var ev in this._events) {
    for (var i = 0; i < this._events[ev].length; i++) {
      if (this._events[ev][i].callback === callback) {
        this._events[ev].splice(i, 1);
        i--;
      }
    }
  }
  return;
}

虽然它适用于不同的索引操作,但我会考虑采用更实用的编程方法(毕竟这就是 lodash 和 underscore 的用途):

if (!event && callback) {
  this._events = _.map(this._events, function(ev) {
    return _.filter(ev, function(trigger, i, ev) {
      return !(trigger.callback === callback);
    });
  });
  return;
}

函数式编程不是直接操作现有数据,而是强调现有数据的不变性,并且通常会依赖创建新结构来反映对现有数据的更改。因此,不是拼接现有数组,而是使用旧结构生成新结构,并将对旧结构的引用替换为对新结构的引用。

不过,这并不能完全解释函数式方法背后的动机,所以我将给您留下一些想法,说明为什么这可能是一个更好的设计决策。在这种情况下,性能可能会更好(多次拼接一个数组是相当昂贵的)。然而,函数式编程更重要的部分是你不必在变量中处理太多的状态,这可以导致更可靠的代码。这是一个完美的例子 - 操作现有结构的索引比让现有函数为您处理状态(在本例中为映射和过滤器)更难正确执行,这会导致索引错误。

于 2013-03-05T23:00:28.093 回答