1 votos

Cómo agregar un objeto de matriz a otra matriz bidimensional por clave con lodash

Tengo un array de mensajes por ejemplo:

[{
    day: "1",
    msgs: [{day: "1", id: 1, msg: 'txt'}]
},{
    day: "2",
    msgs: [{day: "2", id: 2, msg: 'txt'}]
}]

y recibo nuevos mensajes del servidor en este formato:

[
    {day: "1", id: 3, msg: 'txt'},
    {day: "1", id: 4, msg: 'txt'},
    {day: "2", id: 5, msg: 'txt'},
    {day: "3", id: 6, msg: 'txt'}
]

Y necesito fusionar los nuevos valores en el antiguo array de mensajes. Y este es el ejemplo de los resultados que necesito.

[{
    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'}]
}]

He pasado 5h en stack overflow buscando un caso similar pero no lo encontré. Ya intenté usar las funciones de lodash groupBy y forEach y no funcionó. Lo importante es que si VIENE UN NUEVO DÍA del servidor se añada ese día en los resultados antiguos.

1voto

Redu Puntos 11283

Solicitaste un formato de datos que tiene mucha información redundante. Con todo respeto, me gustaría aconsejarte que ajustes tu código para usar un formato de datos como el siguiente;

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

0voto

kernal_lora Puntos 1107

Solo sigue los pasos a continuación. El método .concat de Array concatenará los dos arrays.

    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.concat(array2);

0voto

Nenad Vracar Puntos 17412

Puedes hacer esto en js puro con forEach() y 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)

0voto

robcaa Puntos 151

Creo que la solución de Nenad Vracar es la mejor. Si se admite ECMAScript 6.

Mi solución no requiere: 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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X