我有一个对象,其中我正在存储购物车的选择。因为这是一个 Backbone 应用程序,所以我决定导出购物车商品的小计,以reduce
按数量添加商品价格:
这是一个(人为的)示例:
var App = {
cart : {
item : []
}
}
//...
App.cart.item.push({ qty: 1, price: 34.95});
App.cart.item.push({ qty: 3, price: 24.95});
App.cart.item.push({ qty: 4, price: 1.99});
App.cart.item.push({ qty: 13, price: .99});
当视图被渲染时,小计的计算如下:
_.reduce(App.cart.item,function(memo, num){ return memo + (num.price * num.qty); },0)
这引发了一些争论:
- 一些同事有不同意见,认为
reduce
这里使用的方法不正确,而是使用each
并传递给求和函数,并可能使用 memoize 模式来缓存结果。 - 另一个人认为我不应该在不传递匹配的函数输出的情况下使用 reduce
map
。 - 还有一些人同意,虽然 reduce 是正确的使用方法,但我应该改用
foldl
别名,因为它对未来的开发人员来说更清楚其意图是什么。
诚然,我对 FP 知之甚少,因此我reduce
在 Underscore 中使用该方法纯粹是为了得出小计,而无需将其作为单独的属性存储在 JSON 服务器端。
请向我解释为什么reduce
是或不是“正确”的方法来产生对象属性的总和。显然,我在这里不是在寻找一种纯粹的函数式方法,因为我只是将reduce
其用作实用程序。