2014-02-26 53 views
1

在CoffeeScript中,有時我需要撥打Array.reduce(...) with a default value;然而,不合理的參數排序意味着初始/默認值在reduce函數本身之後,這意味着我必須使用很多parens,這比CoffeeScript想要的要糟糕得多。具有默認值的Array.reduce的CoffeeScript習慣用法

例如:

items = [ (id:'id1', name:'Foo'), (id:'id2', name:'Bar') ] # ... 
itemsById = items.reduce(((memo, item) -> # <-- Too many parens! 
    memo[item.id] = item 
    memo), {}) # Ugly! 

有沒有一種更地道的方式在CS做到這一點?

回答

4

我已經在這個運行自己與其他功能。如果真的把事情搞得一團糟(或者真的讓我困擾),我可能會在別處聲明函數(可能在該行的上面),然後將函數作爲參數傳遞,如下所示:

reduce_callback = (memo, item) -> 
    memo[item.id] = item 
    memo 

itemsById = items.reduce reduce_callback, {} 

不幸的是,你在垂直方向上擴展了很多,這可能並不理想。這僅僅是一個普遍的建議。

+1

我做同樣的事情,尤其是當與回調鏈接函數(例如,當建立一個Underscore管道,甚至鏈接一堆的Ruby的Enumerable方法)。 –

4

這工作:

itemsById = items.reduce (memo, item) -> 
    memo[item.id] = item 
    memo 
, {} 
+3

+1這是一個很好的選擇,但最後一行中的前導',{}'需要視覺回溯到'itemsById'行,然後掃描到該行的末尾;最終這似乎沒有比我更清楚的比我的例子= \ – maerics