Javascript 在嵌套的每个中使用lodash/下划线
我正在尝试将这段代码转换为Lo Dash: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); } }
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;
}