2013-03-05 61 views
0

我想這段代碼轉換爲羅短跑:使用lodash /凸顯了嵌套每個

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.... 
} 
+0

您能否提供一個功能性示例以及顯示問題的片段?至少,迭代器似乎正在工作:http://jsfiddle.net/rq7rJ/。 – 2013-03-05 22:44:22

回答

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和下劃線是,後所有):

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

而不是現有數據的直接操作,函數式編程強調現有數據的不變性,並且通常會依賴於新結構的創建,以反映更改現有數據。因此,不是拼接現有的數組,而是使用舊的結構生成一個新的結構,並且舊的結構的引用被新的引用所替代。

這並不能很好地解釋功能方法背後的動機,所以我會留給你一些想法,爲什麼這可能是一個更好的設計決策。在這種情況下,性能可能會更好(多次拼接陣列非常昂貴)。然而,函數式編程中更重要的部分是,您不必在變量中調整狀態,這可能導致更穩定的代碼。這是一個很好的例子 - 操作現有結構的索引比現有的函數處理狀態(在本例中爲map和filter)導致索引錯誤更難。