【问题标题】:Fastest way to extract two arrays from an object array in javascript从javascript中的对象数组中提取两个数组的最快方法
【发布时间】:2013-01-19 23:35:21
【问题描述】:

假设我有这样的架构:

users: {
   friends: [{name: String, id: String}]
}

将这个对象数组提取到两个单独的数组中的最快方法是什么:

var names = [String]
var ids = [String]

有没有办法在没有 for 循环的情况下做到这一点?需要为一组用户完成此操作,并且我试图避免嵌套 for 循环。也许有更好的方法来存储朋友的姓名和 ID?

【问题讨论】:

  • 大多数解决方案都会以一种或另一种形式进行迭代,至少在幕后。如果您需要转换数据以供其唯一使用,那么可能有更好的方法来存储或处理数据,但如果不知道它是如何使用的,就不可能说出来。 “爆炸”不是您想要做的事情的正确术语,您应该坚持一些内涵较少的东西,例如提取或转换。
  • 谢谢我编辑了问题并删除了explode这个词

标签: javascript mongodb mongoose


【解决方案1】:

使用Array.map():

var names = users.friends.map(function(o) { return o.name; }),
    ids   = users.friends.map(function(o) { return o.id;   });

【讨论】:

    【解决方案2】:

    总有一个循环,在某个地方(我不确定你所说的嵌套循环是什么意思?)。 :)

    如果您正在寻找最快的(这就是您所说的),使用mapforEach 通常不会导致更快的操作,因为每次迭代都调用一个函数,这增加了高架。

    正如您将在jsPerf 中看到的,通常最好使用 for 循环构造。首先,如果数组很长,您将受益于只遍历数组一次(而不是每个属性一次)。为了进一步优化,预先声明数组大小也可以提高性能。

    var names = new Array(totalFriends),
        ids = new Array(totalFriends), friend;
    
    for (var j = 0; j < totalFriends; j++) {
      friend = friends[j];
      names[j] = friend.name;
      ids[j] = friend.id;
    }
    

    地图调用很方便,但可能不是最快的。

    【讨论】:

    • 谢谢你。根据您的建议,我最终改用了 for 循环,因为它肯定要快得多。
    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多