Javascript 为增加价格而减价
我有一个对象,我正在其中存储购物车的选择。由于这是一个主干应用程序,我决定使用Javascript 为增加价格而减价,javascript,underscore.js,reduce,Javascript,Underscore.js,Reduce,我有一个对象,我正在其中存储购物车的选择。由于这是一个主干应用程序,我决定使用reduce按数量添加商品价格,以得出购物车商品的小计: 下面是一个(人为的)例子: 渲染视图时,小计计算如下: _.reduce(App.cart.item,function(memo, num){ return memo + (num.price * num.qty); },0) 这引发了一些争论: 一些同事不同意这里使用的方法不是reduce,而是使用each传递给求和函数,并可能使用memoize模式缓存结
reduce
按数量添加商品价格,以得出购物车商品的小计:
下面是一个(人为的)例子:
渲染视图时,小计计算如下:
_.reduce(App.cart.item,function(memo, num){ return memo + (num.price * num.qty); },0)
这引发了一些争论:
- 一些同事不同意这里使用的方法不是
,而是使用reduce
传递给求和函数,并可能使用memoize模式缓存结果each
- 另一种观点认为,如果不传递匹配的
映射的函数输出,我就不应该使用reduce
- 还有一些人同意,虽然reduce是正确的使用方法,但我应该使用
别名,因为未来的开发人员更清楚它的意图foldl
reduce
方法纯粹是为了推导小计,而不必将其作为单独的属性存储在JSON服务器端
请向我解释
reduce
为什么是或不是生成对象属性总和的“正确”方法。显然,我不是在寻找一种纯粹的函数式方法,因为我只是将reduce
用作一种实用工具。这是一个非常主观的问题,所以我想我会给出一个主观的答案:
- 这里主要有三个问题:实际的代码效率、代码易读性和代码风格。最后一个问题在我看来并不重要,除非它影响代码库的易读性和一致性
- 就效率而言,
比.reduce
+.map
更有效,所以你可以放弃这个想法。使用.reduce
使用转换后的值创建一个新数组-不需要这样做\uuz.map
- 每个求和函数方法的效率可能会稍低一些(您需要在其他地方跟踪运行的总变量),而且在我看来,它不太清晰,因为它会获取相关代码,并将其从使用它的循环中移动得更远。您的操作也不会得到一个干净的返回值——相反,您需要先创建一个变量,然后再重新使用它
- 我认为“记忆化”在这里没有多大意义。您可能希望缓存给定购物车的返回值,并在项目更改时使其无效,但这并不是真正的记忆。当a)一个容易散列的输入总是会产生相同的答案,并且b)计算这个答案很昂贵时,记忆是有意义的。在这种情况下,计算总和可能比散列输入(项目列表)便宜
- 在易读性方面,我强烈倾向于使用下划线别名来隐藏真实JS1.8方法的名称(对我来说,例外是
与。any
。一些
,因为我发现它更易读)。在本例中,这意味着
,而不是.reduce
或。inject
。这使得JS开发人员更容易理解其意图,而JS开发人员正是您所关心的人。foldl
reduce
进行求和非常常见,将reduce
视为一种反馈机制(即f(f(…))
),这一点应该很清楚。仅仅因为“MapReduce”是一个东西并不意味着你必须在你减少之前进行映射reduce
vsfoldl
纯粹是观点,两种观点都是错误的,你应该使用inject
(呵呵)。如果求和是在一个函数中进行的,该函数的名称表明了它的功能,例如calculateTotalPrice,那么不管它如何计算价格都是无关的(只要它是有效的).谢谢你的尝试-或多或少是我的想法,但我想请一位专家参与。谢谢你的时间。
_.reduce(App.cart.item,function(memo, num){ return memo + (num.price * num.qty); },0)