我需要连接两个数组,但有一些条件。
数组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' }
]
}
]
答案 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
});
}