Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在嵌套的每个中使用lodash/下划线_Javascript_Underscore.js_Lodash - Fatal编程技术网

Javascript 在嵌套的每个中使用lodash/下划线

Javascript 在嵌套的每个中使用lodash/下划线,javascript,underscore.js,lodash,Javascript,Underscore.js,Lodash,我正在尝试将这段代码转换为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); } }

我正在尝试将这段代码转换为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;
}
this.\u事件的结构如下:

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

我不认为转换有任何直接的问题,但是原始代码似乎有缺陷——如果您有两个连续的函数要删除,那么只有第一个函数会被删除。每次删除某个内容时,都会跳过列表中的以下项目(要使其正常工作,您必须更加巧妙地使用索引,除非出于任何原因,您对检查回调匹配后的项目漠不关心)。可以通过对原始代码执行以下操作来修复此问题:

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;
}
函数式编程强调现有数据的不变性,而不是直接操纵现有数据,通常依赖于创建新结构来反映现有数据的变化。因此,不再拼接现有阵列,而是使用旧结构生成新的阵列,并将对旧阵列的引用替换为对新阵列的引用


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

您能否提供一个功能示例以及演示问题的代码段?至少,迭代器似乎正在工作:。
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;
}
if (!event && callback) {
  this._events = _.map(this._events, function(ev) {
    return _.filter(ev, function(trigger, i, ev) {
      return !(trigger.callback === callback);
    });
  });
  return;
}