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

mae*_*ics 3 coffeescript

在CoffeeScript中,有时我需要Array.reduce(...)使用默认值进行调用;但是,不幸的是,参数的排序意味着初始值/默认值位于reduce函数本身之后,这意味着我必须使用大量的paren,这似乎比CoffeeScript想要的丑陋得多。

例如:

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

在CS中,是否有更惯用的方法来做到这一点?

mas*_*ash 6

这有效:

itemsById = items.reduce (memo, item) ->
  memo[item.id] = item
  memo
, {}
Run Code Online (Sandbox Code Playgroud)

  • +1这是一个很好的选择,但是最后一行的前导{,{}`要求视觉回溯到`itemsById`行,然后扫描到该行的末尾;最终,对我来说,这似乎比我的例子更清楚= \ (5认同)

Pau*_*ter 5

我自己使用其他功能来运行它。如果它确实使事情变得一团糟(或者真的让我感到困扰),我可能会在其他地方声明该函数(可能在该行上方),然后将该函数作为参数传递,如下所示:

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

itemsById = items.reduce reduce_callback, {}
Run Code Online (Sandbox Code Playgroud)

不幸的是,您纵向扩展了很多,这可能是不希望的。这仅是一般性建议。