在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中有更多惯用的方法吗?
我自己也参与了其他功能。如果它真的乱七八糟(或者它真的困扰我),我可能会在其他地方声明该函数(可能在该行之上),然后将该函数作为参数传递,如下所示:
reduce_callback = (memo, item) ->
memo[item.id] = item
memo
itemsById = items.reduce reduce_callback, {}
不幸的是,你需要垂直扩展,这可能是也可能不是。这只是一般性建议。
这有效:
itemsById = items.reduce (memo, item) ->
memo[item.id] = item
memo
, {}
items = [ {id:'id1', name:'Foo'}, {id:'id2', name:'Bar'} ]
itemsById = {}
itemsById[item.id] = item for item in items
清洁可读。