Слияние Массива Сложных Объектов - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь объединить 2 массива объектов в один массив объектов, сохраняя при этом порядок arr1 в объединенном массиве.

В arr1 существует ключ internalName, который присутствует в arr2. Клавиша type в arr1 представляет значение клавиши от arr2 - например, тип avg в arr1 должен соответствовать ключу average arr2 с тем же internalName.

const arr1 = [
  {internalName: "14_17_years_old", type: "avg"},
  {internalName: "14_17_years_old", type: "sum"},
  {internalName: "18_24_years_old", type: "avg"},
  {internalName: "25_34_years_old", type: "sum"},
  {internalName: "35_44_years_old", type: "avg"},
  {internalName: "35_44_years_old", type: "sum"},
  {internalName: "activity_attendance", type: "sum"},
];

const arr2 = [
  {average: 83, count: 7, internalName: "14_17_years_old", name: "14-17 Years Old", sum: 578},
  {average: 168, count: 11, internalName: "18_24_years_old", name: "18-24 Years Old", sum: 1850},
  {average: 193, count: 11, internalName: "25_34_years_old", name: "25-34 Years Old", sum: 2126},
  {average: 237, count: 10, internalName: "35_44_years_old", name: "35-44 Years Old", sum: 2370},
  {average: 828, count: 28, internalName: "activity_attendance", name: "Activity Attendance", sum: 23190}
];

Ожидаемый результат:

const expected = [
  {internalName: "14_17_years_old", name: "14-17 Years Old", type: "avg", value: 83},
  {internalName: "14_17_years_old", name: "14-17 Years Old", type: "sum", value: 578},
  {internalName: "18_24_years_old", name: "18-24 Years Old", type: "avg", value: 168},
  {internalName: "25_34_years_old", name: "25-34 Years Old", type: "sum", value: 2126},
  {internalName: "35_44_years_old", name: "35-44 Years Old", type: "avg", value: 237},
  {internalName: "35_44_years_old", name: "35-44 Years Old", type: "sum", value: 2370},
  {internalName: "activity_attendance", name: "Activity Attendance", type: "sum", value: 23190},
];

Я начал по маршруту, используя forEach с вложенным map, но он ничего не возвращает.

arr1.forEach((x) => {
  if (x.type === 'sum') {
    return arr2.map(y => ({
      internalName: y.internalName,
      name: y.name,
      type: 'sum',
      value: y.sum,
    }));
  }

  return arr2.map(y => ({
      internalName: y.internalName,
      name: y.name,
      type: 'avg',
      value: y.avg,
    }));
});

На самом деле есть вопрос из двух частей - как я могу сделать это и сделать это без такого большого количества кода?

1 Ответ

0 голосов
/ 18 января 2019

Вы можете выполнить поиск с помощью arr2, чтобы разрешить постоянный поиск объектов. Затем вы можете map над элементами в arr1 и построить объекты из нового массива результатов:

const arr1 = [{internalName: "14_17_years_old", type: "avg"},{internalName: "14_17_years_old", type: "sum"},{internalName: "18_24_years_old", type: "avg"},{internalName: "25_34_years_old", type: "sum"},{internalName: "35_44_years_old", type: "avg"},{internalName: "35_44_years_old", type: "sum"},{internalName: "activity_attendance", type: "sum"},];
const arr2 = [{average: 83, count: 7, internalName: "14_17_years_old", name: "14-17 Years Old", sum: 578},{average: 168, count: 11, internalName: "18_24_years_old", name: "18-24 Years Old", sum: 1850},{average: 193, count: 11, internalName: "25_34_years_old", name: "25-34 Years Old", sum: 2126},{average: 237, count: 10, internalName: "35_44_years_old", name: "35-44 Years Old", sum: 2370},{average: 828, count: 28, internalName: "activity_attendance", name: "Activity Attendance", sum: 23190}];

let lookup = arr2.reduce((map, {internalName, average:avg, sum, name }) => map.set(internalName, {avg, sum, name}), new Map)

let res = arr1.map(({internalName, type}) => ({
       internalName, 
       type, 
       value: lookup.get(internalName)[type],
       name: lookup.get(internalName)['name']
  }))

console.log(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...