嵌套的 Lodash forEach

3

我有一个比较深的内存数据库,我认为我已经找到了最好的实现代码,如果有人知道在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中所有用户及其位置的最佳方式。

1个回答

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分 :) 但我记得/看到lodash比coffeescript的for循环更快? - gabeio
我承认我曾经考虑过手写JavaScript循环。然而,在使用实时CoffeeScript编译器(“尝试Coffeescript”按钮)并检查CoffeeScript如何将其循环转换为JS后,我没有看到任何与手工编写的JS循环截然不同的东西。如果你有你听到或看到的声明的参考资料,我会很想看看它。 - Louis
jsperf 上有很多循环速度测试。lodash 通常是最快的,因为它能够适应浏览器引擎。在某些情况下,它使用本地的 each,在其他情况下则使用 while 循环。Coffeescript 总是使用 for 循环,所以它通常表现良好,但不如 lodash - hpaulj
@hpaulj,请指向一个具体的jsperf测试,以展示您所说的内容。 - Louis
@hpaulj,你链接的测试结果是有误导性的。它依赖于array没有被声明为var。我从你链接的测试中创建了两个测试。第一个在末尾添加了一个新的CoffeeScript测试,其中包含var array = window.array。这个新测试是最快的。 - Louis
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接