我有一个消息数组,例如:
[{
day: "1",
msgs: [{day: "1", id: 1, msg: 'txt'}]
},{
day: "2",
msgs: [{day: "2", id: 2, msg: 'txt'}]
}]
我以这种格式从服务器收到新消息:
[
{day: "1", id: 3, msg: 'txt'},
{day: "1", id: 4, msg: 'txt'},
{day: "2", id: 5, msg: 'txt'},
{day: "3", id: 6, msg: 'txt'}
]
我需要将新值合并到旧消息数组中。这就是我需要的结果的例子。
[{
day: "1",
msgs: [{day: "1", id: 1, msg: 'txt'},
{day: "1", id: 3, msg: 'txt'},
{day: "1", id: 4, msg: 'txt'}]
},{
day: "2",
msgs: [{day: "2", id: 2, msg: 'txt'},
{day: "2", id: 5, msg: 'txt'}]
},{
day: "3",
msgs: [{day: "3", id: 6, msg: 'txt'}]
}]
我花了5小时在堆栈溢出上找到类似的情况,但我没有找到它。 我已经尝试过使用lodash函数groupBy和forEch但它没有用。 重要的是,如果NEW DAY来自服务器,那么在旧结果中添加当天。
答案 0 :(得分:1)
您要求数据格式有很多冗余信息。在适当尊重的情况下,我建议您调整代码以使用如下数据格式;
var data = [{day: "1", id: 3, msg: 'txt'},
{day: "1", id: 4, msg: 'txt'},
{day: "2", id: 5, msg: 'txt'},
{day: "3", id: 6, msg: 'txt'}
],
dailyMsg = data.reduce((dm,obj) => dm[obj.day] !== void 0 ? (dm[obj.day] = dm[obj.day].concat({id: obj.id, msg: obj.msg}),dm)
: (dm[obj.day] = [{id: obj.id, msg: obj.msg}],dm),{});
console.log(dailyMsg);
答案 1 :(得分:0)
请按照以下步骤操作。
数组.concat
方法将连接两个数组。
var arry1= [{
day: "1",
msgs: [{day: "1", id: 1, msg: 'txt'}]
},{
day: "2",
msgs: [{day: "2", id: 2, msg: 'txt'}]
}];
var array2= [
{day: "1", id: 3, msg: 'txt'},
{day: "1", id: 4, msg: 'txt'},
{day: "2", id: 5, msg: 'txt'},
{day: "3", id: 6, msg: 'txt'}
];
var fullArray= arry1.cancat(array2);
答案 2 :(得分:0)
您可以使用forEach()
和find()
var ar1 = [{
day: "1",
msgs: [{day: "1", id: 1, msg: 'txt'}]
},{
day: "2",
msgs: [{day: "2", id: 2, msg: 'txt'}]
}];
var ar2 = [
{day: "1", id: 3, msg: 'txt'},
{day: "1", id: 4, msg: 'txt'},
{day: "2", id: 5, msg: 'txt'},
{day: "3", id: 6, msg: 'txt'}
];
ar2.forEach(function(o) {
var e = ar1.find((a) => a.day == o.day);
(e != undefined) ? e.msgs.push(o) : ar1.push({day: o.day,msgs: [o]});
})
console.log(ar1)

答案 3 :(得分:0)
认为Nenad Vracar解决方案是最好的。如果支持ECMAScript 6。
我的解决方案不需要:ECMAScript 6
var oldMessages = [
{
day: "1",
msgs: [{day: "1", id: 1, msg: 'txt'}]
},
{
day: "2",
msgs: [{day: "2", id: 2, msg: 'txt'}]
}];
var newMessages = [
{day: "1", id: 3, msg: 'txt'},
{day: "1", id: 4, msg: 'txt'},
{day: "2", id: 5, msg: 'txt'},
{day: "3", id: 6, msg: 'txt'}
];
function merge(oldMessages, newMessages) {
for (var i=0; i<newMessages.length; i++) {
var exists = false;
for (var j=0; j<oldMessages.length; j++) {
if (oldMessages[j].day == newMessages[i].day) {
oldMessages[j].msgs.push(newMessages[i]);
exists=true;
break;
}
}
if (!exists) {
oldMessages.push({'day':newMessages[i].day,'msgs':newMessages[i]});
}
}
return oldMessages;
}
console.log(merge(oldMessages, newMessages));