Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为增加价格而减价_Javascript_Underscore.js_Reduce - Fatal编程技术网

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
    ,而是使用
    each
    传递给求和函数,并可能使用memoize模式缓存结果
  • 另一种观点认为,如果不传递匹配的
    映射的函数输出,我就不应该使用reduce
  • 还有一些人同意,虽然reduce是正确的使用方法,但我应该使用
    foldl
    别名,因为未来的开发人员更清楚它的意图
诚然,我对FP知之甚少,因此我在下划线中使用
reduce
方法纯粹是为了推导小计,而不必将其作为单独的属性存储在JSON服务器端


请向我解释
reduce
为什么是或不是生成对象属性总和的“正确”方法。显然,我不是在寻找一种纯粹的函数式方法,因为我只是将
reduce
用作一种实用工具。

这是一个非常主观的问题,所以我想我会给出一个主观的答案:

  • 这里主要有三个问题:实际的代码效率、代码易读性和代码风格。最后一个问题在我看来并不重要,除非它影响代码库的易读性和一致性

  • 就效率而言,
    .reduce
    .map
    +
    .reduce
    更有效,所以你可以放弃这个想法。使用
    \uuz.map
    使用转换后的值创建一个新数组-不需要这样做

  • 每个求和函数方法的效率可能会稍低一些(您需要在其他地方跟踪运行的总变量),而且在我看来,它不太清晰,因为它会获取相关代码,并将其从使用它的循环中移动得更远。您的操作也不会得到一个干净的返回值——相反,您需要先创建一个变量,然后再重新使用它

  • 我认为“记忆化”在这里没有多大意义。您可能希望缓存给定购物车的返回值,并在项目更改时使其无效,但这并不是真正的记忆。当a)一个容易散列的输入总是会产生相同的答案,并且b)计算这个答案很昂贵时,记忆是有意义的。在这种情况下,计算总和可能比散列输入(项目列表)便宜

  • 在易读性方面,我强烈倾向于使用下划线别名来隐藏真实JS1.8方法的名称(对我来说,例外是
    。any
    。一些
    ,因为我发现它更易读)。在本例中,这意味着
    .reduce
    ,而不是
    。inject
    。foldl
    。这使得JS开发人员更容易理解其意图,而JS开发人员正是您所关心的人


使用
reduce
进行求和非常常见,将
reduce
视为一种反馈机制(即
f(f(…))
),这一点应该很清楚。仅仅因为“MapReduce”是一个东西并不意味着你必须在你减少之前进行映射
reduce
vs
foldl
纯粹是观点,两种观点都是错误的,你应该使用
inject
(呵呵)。如果求和是在一个函数中进行的,该函数的名称表明了它的功能,例如calculateTotalPrice,那么不管它如何计算价格都是无关的(只要它是有效的).谢谢你的尝试-或多或少是我的想法,但我想请一位专家参与。谢谢你的时间。
_.reduce(App.cart.item,function(memo, num){ return memo + (num.price * num.qty); },0)