underscore.js - 从嵌入在对象列表中的对象创建唯一项的数组

时间:2015-09-29 23:28:13

标签: javascript arrays mongodb meteor underscore.js

我一直在尝试在我正在进行的CRONTAB(5) Man Page项目中使用underscore.js,但似乎无法弄清楚如何转换一组对象。

对象看起来像这样(大约有15k,但它们看起来都像这两个):

 [{
   "_id": "a_0011223344",
   "taggedUsers": [{
     "id": 1122244453,
     "username": "john123"
   }],
   "field": "ABC"
 }, {
   "_id": "a_0011223345",
   "taggedUsers": [{
     "id": 1122244454,
     "username": "bill123"
   }, {
     "id": 1122244455,
     "username": "jim123"
   }],
   "field": "ABC"
 }]

每个对象都可以有一个或多个"taggedUsers"个对象,我需要一个唯一的"taggedUsers.username"字段列表。 Meteor不支持mongoDB的Meteor函数,所以我尝试使用underscore.js(根据我读过的内容和distinct中的推荐)。

在我的服务器端控制台db.myCollection.distinct("taggedUsers.username")中返回所需的结果["john123", "bill123", "jim123"],但我不能在underscore.js中复制它。

我一直在尝试_.each_.map_.pluck_.uniq的组合,但一直没有成功。我认为它可能与嵌入对象中的字段有关,但我不确定。

理想情况下,我想返回一个像这样的对象数组:

[{
  "id": 1122244453,
  "username": "john123",
  "field": "ABC"
}, {
  "id": 1122244454,
  "username": "bill123",
  "field": "ABC"
}, {
  "id": 1122244455,
  "username": "jim123",
  "field": "DEF"
}]
仅使用taggedUsers.usernametaggedUsers.idfield字段,并删除了所有重复项,但如果我还可以获得taggedUsers.usernames的数组,就像我一样在db.colleciton.distinct()函数中。

最终知道如何获取基本数组,独特对象数组(或者甚至可能如何在模板帮助器中获取db.collection.distinct()的结果)会很高兴,但任何帮助或观点在正确的方向将不胜感激!

1 个答案:

答案 0 :(得分:2)

根据我们的对话,听起来通过方法调用在服务器上计算它会更好。出于教育目的,以下是使用下划线的方法:

// Get an array of docs somehow
var docs = Collection.find().fetch();

var taggedUsers = _.chain(docs)
  .map(function(d) {
    // Copy the 'field' to each of the tagged users within a doc
    _.each(d.taggedUsers, function(user) {
      user.field = d.field;
    });
    return d;
  })
  .pluck('taggedUsers') // Extract only the tagged users arrays
  .flatten() // Flatten them into a single array
  .value();

// taggedUsers could look something like:
// [ { id: 1122244453, username: 'john123', field: 'ABC' },
//   { id: 1122244454, username: 'bill123', field: 'ABC' },
//   { id: 1122244455, username: 'jim123', field: 'ABC' },
//   { id: 1122244453, username: 'john123', field: 'ABC' } ]

// Compute a unique lists of tagged users, where the docs are unique by id
var utu = _.uniq(taggedUsers, false, function(user) {return user.id;});