【问题标题】:How can I perform an inject operation in CoffeeScript?如何在 CoffeeScript 中执行注入操作?
【发布时间】:2012-06-21 01:35:53
【问题描述】:

我正在尝试这样做,但使用的是 CoffeeScript:

# ruby:
items.map {|item| item.price * item.quantity }.reduce(:+)

到目前为止我所拥有的:

# coffeescript:
item.price * item.quantity for item in items

如何对数组中的所有项目求和?更一般地说,如何对数组中的所有项目执行任何操作(在 Ruby 中,这将是 injectreduce)?

【问题讨论】:

    标签: ruby coffeescript


    【解决方案1】:

    没关系,我找到了。用reduce完成了

    (item.price * item.quantity for item in items).reduce (x, y) -> x + y
    

    【讨论】:

    • 请注意,reduce() 在 IE 中没有最好的浏览器支持。
    • @alex 有趣...因为 CoffeeScript 很薄,我虽然它是跨浏览器兼容的。幸运的是 IE 在这里不是问题,但我会记住这一点。谢谢!
    • 如果你想要一个便携的reduce,使用下划线:documentcloud.github.com/underscore/#reduce
    • @alfonso:CoffeeScript 的“瘦”正是这里的问题:reduce 与 CoffeeScript 无关,它是 ECMAScript 核心库中添加的 ECMAScript 5 中的一种方法。跨度>
    • @alfonso 或者,如果您不想包含 Underscore.js(或者您更喜欢本机语法),您可以添加一个 Array.prototype.reduce 实现作为列出的in the MDN documentation。或者,如果您发现自己使用了许多 ECMAScript 5 函数,您可以使用“shim”,例如 es5-shim,它将添加所有这些很棒的东西 :)
    【解决方案2】:

    我不知道一般的reduce 函数,但是对于累加器,你可以这样做

    sum = 0
    sum += item.price * item.quantity for item in items
    

    【讨论】:

      【解决方案3】:

      更通用的 reduce 函数可能如下所示:

      total = ((agg = 0) ->
        agg + item.price * item.quantity
      )(total, item) for item in items
      

      result = ((aggregate = 'default value') ->
        // function body changing, then returning aggregate
        aggregate
      )(result, i) for i in some_array
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-09
        • 2021-04-22
        • 2010-10-03
        • 2017-07-15
        • 2011-07-21
        • 1970-01-01
        相关资源
        最近更新 更多