javascript - 下划线减少表示增加价格

标签 javascript underscore.js reduce

我有一个对象,其中存储了购物车的选择。因为这是一个 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});

渲染 View 时,小计计算如下:

_.reduce(App.cart.item,function(memo, num){ return memo + (num.price * num.qty); },0)

这引发了一些争论:

  • 一些同事不同意,认为 reduce 不是此处使用的正确方法,而是使用 each 并传递给求和函数,并可能使用 memoize 模式缓存结果。
  • 另一个人认为,如果不传递匹配 map 的函数输出,我就不应该使用 reduce。
  • 还有一些人同意,虽然 reduce 是正确的使用方法,但我应该使用 foldl 别名,因为 future 的开发人员可以更清楚地了解其意图。

诚然,我对 FP 知之甚少,所以我在 Underscore 中使用 reduce 方法纯粹是一种导出小计的方法,而不必将其存储为 JSON 中的单独属性服务器端。

请向我解释为什么reduce是或不是生成对象属性总和的“正确”方法。显然,我在这里并不是在寻找纯函数方法,因为我仅使用 reduce 作为实用程序。

最佳答案

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

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

  • 从效率上来说,_.reduce_.map + _.reduce效率更高,所以你可以放弃这个想法。使用 _.map 使用转换后的值创建一个新数组 - 不需要这样做。

  • _.each + 求和函数方法的效率可能会稍低(您需要在其他地方跟踪运行总计变量),而且在我看来,它不太清晰,因为它获取相关代码并将其移离您正在使用它的循环。您也不会为您的操作获得一个干净的返回值 - 相反,您有一个变量卡在外部作用域中的某个位置,您需要首先创建然后重新使用该变量。

  • 我认为“内存”在这里没有多大意义。您可能想要缓存给定购物车的返回值,并在项目更改时使其无效,但这实际上并不是内存。当a)容易散列的输入总是产生相同的答案,并且b)计算该答案的成本很高时,内存就有意义。在这种情况下,计算总和可能比对输入(您的项目列表)进行哈希处理更便宜。

  • 就易读性而言,我强烈倾向于使用下划线别名来掩盖真正的 JS 1.8 方法的名称(对我来说,异常(exception)是 .any .some,因为我发现它更清晰)。在本例中,这意味着 .reduce,而不是 .inject.foldl。这使得 JS 开发人员更容易理解其意图,而 JS 开发人员就是您关心的人。

关于javascript - 下划线减少表示增加价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321392/

相关文章:

group-by - 使用 lodash/underscore 分组并求和

javascript - 一个键对象的总和数组在 JavaScript 中为超过 2 个项目返回 NaN

scala - Spark reduceByKey 仅在某些条件下减少

javascript - 为什么在下划线中使用 typeof (/./) !== 'function'

javascript - Underscorejs 对象到集合

ruby - 减少 Ruby 中的多个变量

javascript - jQuery each 和 change 合并

javascript - 从 ajax 响应中解析 json 和 html 数据

javascript - 如何循环出现在元素之后的元素?

javascript - 如何在饼图中添加和操作值?