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

问题描述 投票:2回答:3

在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中有更多惯用的方法吗?

coffeescript
3个回答
5
投票

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

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

itemsById = items.reduce reduce_callback, {}

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


5
投票

这有效:

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

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

清洁可读。

© www.soinside.com 2019 - 2024. All rights reserved.