【问题标题】:Nested Lodash ForEach嵌套 Lodash ForEach
【发布时间】:2014-02-27 06:24:19
【问题描述】:

我有一个相当深的内存数据库,我想,我已经找到了代码的最佳实现,如果有人有更好的方法在 lodash 中执行双 forEach 循环,或者我以某种方式错误地使用它会很高兴知道。

对象:

smallDB = {
  user1:{
    permissions:[],
    locations:[
      {ip:'0.0.0.0',messages:[]},
      {ip:'',messages:[]}
    ]
  },
  user2:{
    permissions:[],
    locations:[
      {ip:'0.0.0.0',messages:[]},
      {ip:'0.0.1.0',messages:[{mid:'a unique id','user':'the sender',message:'the text of the message'}]}
    ]
  }
}

发送我使用的消息:

ld.forEach smallDB, (a)->
  ld.forEach a.locations, (b)->
    b.messages.push {mid,user,message}

我只是想确保这是向 smallDB 中的所有用户及其所有位置的所有用户添加消息到迷你数据库的最佳方式

【问题讨论】:

    标签: node.js object coffeescript performance lodash


    【解决方案1】:

    如果您使用{mid,user,message} 创建的对象是不可变的,您可以进行一项非常简单的优化:

    record = {mid,user,message}
    ld.forEach smallDB, (a)->
      ld.forEach a.locations, (b)->
        b.messages.push record
    

    如果您这样做,您可以节省每次推送时创建新对象的成本。放弃forEach 转而使用for 也会让事情变得更快。

    通过允许更直接地访问您在原始代码中以b.messages 访问的数组,可以进一步优化,但这会使添加和删除用户或位置变得复杂。我不认为这是值得的,除非通过分析证明它不是过早的优化。

    【讨论】:

    • 它们是不可变的,所以 +1
    • 我承认我在考虑手写 JavaScript 循环。然而,在使用实时的CoffeeScript compiler(“Try Coffeescript”按钮)并检查 CoffeeScript 如何将其循环转换为 JS 之后,我没有看到与手工制作的 JS 循环有什么显着不同的地方。如果您对听到或看到的声明有参考,我很想看看。
    • jsperf 上有很多循环速度测试。 lodash 通常是最快的,因为它可以适应浏览器引擎。在某些情况下,它使用原生的each,在其他情况下,它使用while 循环。 Coffeescript 总是使用for 循环,所以它通常做得很好,但不如lodash
    • @hpaulj 请向我们指出一个特定的 jsperf 测试来显示您所说的内容。
    • 我看到了这个...jsperf.com/prime-vs-underscore-vs-lodash/3我知道这不是 forEach 但它是一个咖啡脚本,其完成时间缩短了近 2 倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2013-03-23
    • 1970-01-01
    • 2016-03-23
    • 2017-10-19
    相关资源
    最近更新 更多