如何使用lodash通过键将一个数组对象添加到另一个二维数组

时间:2016-09-03 12:28:26

标签: javascript arrays lodash

我有一个消息数组,例如:

[{
    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来自服务器,那么在旧结果中添加当天。

4 个答案:

答案 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()

在纯js中执行此操作



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));