具有默认值的Array.reduce的CoffeeScript习惯用法

时间:2014-02-26 00:02:03

标签: coffeescript

在CoffeeScript中,我有时需要拨打Array.reduce(...) with a default value;然而,参数的不幸排序意味着初始/默认值在reduce函数本身之后,这意味着我必须使用很多parens,这似乎比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中有更多惯用的方法吗?

3 个答案:

答案 0 :(得分:5)

这有效:

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

答案 1 :(得分:5)

我自己也参与其他功能。如果它真的乱七八糟(或者它真的困扰我),我可能会在其他地方声明该函数(可能在该行之上),然后将该函数作为参数传递,如下所示:

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

itemsById = items.reduce reduce_callback, {}

不幸的是,你需要垂直扩展,这可能是也可能不是。这只是一个普遍的建议。

答案 2 :(得分:0)

items = [ {id:'id1', name:'Foo'}, {id:'id2', name:'Bar'} ]
itemsById = {}
itemsById[item.id] = item for item in items

清洁可读。