Каков наилучший способ объединения / объединения под двумя массивами без нарушения порядка сортировки? - PullRequest
0 голосов
/ 28 сентября 2019

Пример массива приведен ниже:

   var aa = [{date: "sep", data:[1,2,3]}, {date: "oct", data:[4,5,6]}];
   var bb = [{date: "oct", data:[1,2,3]}, {date: "nov", data:[40,50,60]}, {date: "dec", data:[41,51,61]}];

после слияния результат должен выглядеть следующим образом:

  var mergedArray =
 [
{date: "sep", data:[1,2,3]},
{date: "oct", data:[4,5,6,1,2,3]},
{date: "nov", data:[40,50,60]},
{date: "dec", data:[41,51,61]}
]

Ответы [ 3 ]

2 голосов
/ 28 сентября 2019

Вы можете использовать .reduce(), чтобы преобразовать два массива объектов в объект, где ключом для объекта является каждый date, а каждый date хранит ссылку на весь объект.Однако, если происходит повторяющаяся дата (то есть: дата уже существует в накопленном объекте), вы можете вместо этого .concat() массив на уже существующий массив.Наконец, используя массив порядков дат, который мы изначально создали, вы можете отобразить ваш результирующий объект в массив объединенных объектов, например так:

const aa = [{date: "sep", data:[1,2,3]}, {date: "oct", data:[4,5,6]}];
const bb = [{date: "oct", data:[1,2,3]}, {date: "nov", data:[40,50,60]}, {date: "dec", data:[41,51,61]}];

const merged = [...aa, ...bb];
const order = [...new Set(merged.map(({date}) => date))];

const mergedObj = merged.reduce((acc, {date, data, ...rest }) => {
  acc[date] = acc[date] || {date, ...rest, data: []};
  acc[date].data = acc[date].data.concat(data);
  return acc;
}, {});

const res = order.map(key => mergedObj[key]);
console.log(res);
0 голосов
/ 28 сентября 2019

Вы можете взять Map и сгруппировать по date и получить новые объекты в качестве набора результатов.

var array1 = [{ date: "sep", data: [1, 2, 3] }, { date: "oct", data: [4, 5, 6] }],
    array2 = [{ date: "oct", data: [1, 2, 3] }, { date: "nov", data: [40, 50, 60] }, { date: "dec", data: [41, 51, 61] }],
    result = Array.from(
        [...array1, ...array2].reduce(
            (m, { date, data }) => m.set(date, [...(m.get(date) || []), ...data]),
            new Map
        ),
        ([date, data]) => ({ date, data })
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 28 сентября 2019

Вы можете сделать это всего за один цикл.

  
  const aa = [{date: "sep", data:[1,2,3]}, {date: "oct", data:[4,5,6]}];
    const bb = [{date: "oct", data:[1,2,3]}, {date: "nov", data:[40,50,60]}, {date: "dec", data:[41,51,61]}];
    
    let tempArr = aa;
    
bb.forEach(rec => { 
    let findIndex = tempArr.findIndex(obj => obj.date == rec.date);
    if(findIndex==-1){
       tempArr.push(rec);
       } else {
      tempArr[findIndex].data = tempArr[findIndex].data.concat(rec.data);
       }
    });
    console.log(tempArr);
...