合并具有相同值的对象

时间:2014-12-31 00:37:24

标签: javascript node.js

如果两个对象具有相同的值,我试图将值从一个对象添加到另一个对象。

这就是对象的基本外观:

var comments = [
  {
    author: '4jdf7s',
    message: 'Comment text here',
    posted: '2014-12-29 14:30'
  },
  {
    author: '87sd3w',
    message: 'Comment text here',
    posted: '2014-12-30 12:00'
  }
];

var users = [
  {
    _id: '87sd3w',
    username: 'MyUsername'
  },
  {
    _id: '4jdf7s',
    username: 'OtherUsername'
  }
];

由于author_id相同,我想将users.username添加到comments.username,如下所示:

var comments = [
  {
    author: '4jdf7s',
    username: 'OtherUsername',
    message: 'Comment text here',
    posted: '2014-12-29 14:30'
  },
  {
    author: '87sd3w',
    username: 'MyUsername',
    message: 'Comment text here',
    posted: '2014-12-30 12:00'
  }
];

comments对象已被排序,这也是为什么它不能被扰乱的原因。

这是我目前的代码,但它根本不起作用:

comments.forEach(function(i, index) {
  users.forEach(function(e) {
    if(e._id == i.author) {
      comments[index].username = e.username;
    }
  });
});

2 个答案:

答案 0 :(得分:2)

Array.forEach的回调将对象作为第一个参数,而不是索引。所以改为:

comments.forEach(function(comment) {
    users.forEach(function(user) {
        if (user._id === comment.author) {
            comment.username = user.username;
        }
    });
});

还想指出,像这样的嵌套循环对于大量数据集来说是个坏主意;它的复杂度O(N*M)。此外,一旦找到匹配项,循环就会继续。我建议您先创建用户查找,以便每次查询都是O(1),将整个代码转换为O(N)

var usersById = {};
users.forEach(function(user) { usersById[user._id] = user; });

comments.forEach(function(comment) {
    var user = usersById[comment.author];
    if (user) {
        comment.username = user.username;
    }
});

答案 1 :(得分:1)

你可以预先设定作者以避免内循环。

var cache = users.reduce(function(acc, user){
  acc[user._id] = user.name; 
  return acc;}, {}
);
comments.forEach(function(comment){
  comment.username = cache[comment.author];
});