【问题标题】:Get all values from a specific key within an array - JS从数组中的特定键获取所有值 - JS
【发布时间】:2014-04-18 10:12:32
【问题描述】:

我正在尝试从数组中的特定键 (_id) 访问所有值。 我的数组:

"users" : [
    { "_id" : "LqTE6we2TYaA3v23K" },  
    { "_id" : "knfoWfpn5Y9niSgae" },
    { "_id" : "NkHWuyRCpxCvCHJcA" },  
    { "_id" : "YQF6BaCA9Xc8aaYTY" },  
    { "_id" : "mceWvJgGfpH3XB4mh" },  
    { "_id" : "zAWoF3BiLpAAv4vmP" },       
    { "_id" : "c4fLw7TfkGu9jdbFT" } 
]

我想要这个:

[ 'LqTE6we2TYaA3v23K', 'knfoWfpn5Y9niSgae', 'NkHWuyRCpxCvCHJcA', …]

是否可以在不循环数组的情况下实现这一点? 任何帮助将不胜感激。

【问题讨论】:

  • 想要 JavaScript 方法或 MongoDB 方法。使用您当前的标签,您将主要获得纯 JavaScript 响应,所以我希望这就是您想要的。

标签: javascript arrays mongodb


【解决方案1】:

map 在 ECMA-262 标准第 5 版中被添加,所以不久前。

性能也不是最好的之一。

http://jsperf.com/map-vs-native-for-loop/2

因此,如果您想要性能和兼容性:

var array=[],l=users.length;
while(l--){array[l]=users[l]._id}
// now array contains your id's

速度更快,代码也不长。

  1. while 循环在大多数浏览器上是最快的
  2. 如果已经有索引,直接设置数组索引也比push

演示

http://jsfiddle.net/vmfju/

map的优势自然是它是基于新技术的内联函数,更易于阅读。 所以@Hatsjoem 也是一个不错的选择。

【讨论】:

  • 谢谢!祝你有美好的一天。
【解决方案2】:

如上所述,根据您的问题标签,您确实不确定您想要什么。当然,所有 JavaScript 方法都涉及某种形式的“循环”,无论使用哪种方法。

可能实际上意味着从 MongoDB 获取数据?好吧,你可以,我只是假设你实际上是在使用基于 _id 值的 Meteor,所以我使用该语法来特定调用聚合方法:

db.collection("collection").aggregate([
    { "$unwind": "$users" },
    { "$group": {
        "_id": "$_id",
        "users": { "$push": "$users._id" }
    }}
])

这样只会将特定的 _id 字段从数组中的文档中提取出来,然后将它们 $push 拉回到只包含这些值的数组中。因此,您可以发送响应,而无需“后处理”从结果中删除 _id 键。

因此,如果您确实在使用 Meteor,那么您需要访问原始集合,而不仅仅是不能访问聚合方法的“Meteor 集合”对象。对于任何接近原生驱动程序的东西,无论你的正常语法是什么。

【讨论】:

  • 1.谢谢您的帮助!是的,我正在使用 Meteor。我的问题:我只想订阅集合中的特定条目。它被称为:通知。在我的用户集合中,我存储了对主通知的引用及其 _id。我正在考虑在 Iron-router 配置(之前)方法中获取用户的通知 ID 数组,然后在 waitOn 函数中返回 Meteor.subscribe('notifications', notificationsIdArray) 。但是,这不是 100% 反应性的。我不知道为什么,但只有当我添加 2 个通知时,更改才会发布到客户端(或网站刷新)。
  • 2.因为我需要它来订阅和发布数据,所以我需要把它放在我的 /lib/router.js 中,因此我无法使用 db 访问原始集合。
  • @user3475602 是的,你可以。这是您要“发布”的代码的“内部”部分,所以可以,就像任何任意代码一样。因此,如果您确实希望将其作为“已发布”功能,那么绝对有可能。无论如何都比客户端迭代要好。
  • 我需要定义db吗?这可能是一个愚蠢的问题,但我是 Meteor 和 MongoDB 的新手,如果我尝试你的代码 sn-p,我会得到错误:找不到变量 db。
  • @user3475602 抱歉,如果不完全简洁,但是是的,您需要一个底层连接的句柄,然后一切实际上都是“节点本机驱动程序”对象和方法,而不是 Meteor 提供的包装器。但它当然可以做到。
猜你喜欢
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多