从2个数组创建一个新数组 - 具有条件

时间:2014-07-07 09:09:33

标签: javascript json

我需要连接两个数组,但有一些条件。

数组1是一个包含用户ID,用户名的对象数组。

数组2包含属于第一个数组中用户ID的其他数据。 " sentBy'中的ID参数匹配数组1中的id。

我整夜都在摸不着头脑,为了找到解决这个问题的方法,我还在抓它。任何帮助非常感谢。

数组1:

[ { id: 1,
    username: 'test2' },
  { id: 2,
    username: 'test3' },
  { id: 3,
    username: 'test4' } ]

数组2:

[ { sentBy: 1,
    message: 'hey',
    createdAt: 'date' },
  { sentBy: 3,
    message: 'hey2',
    createdAt: 'date' },
  { sentBy: 1,
    message: 'hey3',
    createdAt: 'date' } ]

最终结果应如下所示:

[ 
  { 
    id: 1,
    username: 'test2',
    offlineMessages: 
    [ 
      { message: 'hey', createdAt: 'date' },
      { message: 'hey3', createdAt: 'date' }
    ] 
  },
  { 
    id: 2,
    username: 'test3',
    offlineMessages: [] 
   },
  { 
    id: 3,
    username: 'test4',
    offlineMessages: 
    [ 
      { message: 'hey2', createdAt: 'date' }
    ] 
   } 
]

3 个答案:

答案 0 :(得分:3)

这是一个解决方案。这将就地修改users数组。

var users = [ { id: 759141,
    username: 'test2' },
  { id: 759142,
    username: 'test3' },
  { id: 759143,
    username: 'test4' } ];

var messages = [ { sentBy: 759141,
    message: 'hey',
    createdAt: 'date' },
  { sentBy: 759143,
    message: 'hey2',
    createdAt: 'date' },
  { sentBy: 759141,
    message: 'hey3',
    createdAt: 'date' } ];

var usersMap = {};
var user;

for (var i = 0; i < users.length; ++i) {
    user = users[i];
    usersMap[user.id] = user;
    user.offlineMessages = [];
}

for (var i = 0; i < messages.length; ++i) {
    user = usersMap[messages[i].sentBy];

    if (user) {
        user.offlineMessages.push({
            message: messages[i].message,
            createdAt: messages[i].createdAt
        });
    }
}

答案 1 :(得分:1)

尝试此功能:

var getMessageById = function (userId) { 
    return array2.filter(function (obj) { 
        return obj.sentBy == userId; 
    }); 
};

它将返回特定用户的所有消息。

答案 2 :(得分:0)

我喜欢使用哈希表..

result = []; // -> Should be {} ! Read comments below!
for(var i in array1) {
  result[array1[i].id] = array1[i];
  result[array1[i].id].offlineMessages = [];
}

for(var i in array2) {
  result[array2[i].sendBy].offlineMessages.push( {
    message: array2[i].message,
    createdAt: array2[i].createdAt
  });
}