Как получить данные из сложных структур объектов массива?

У меня есть такой объект

data: {
      dataFirst: { 
        Food: [ {id: 536131, name: "option1", }]
      },       
      dataSecond: { 
        Autos: [{id: 678, name: 'option1'}],
        Houses: [
          {id: 6876, name: "option1"},
          {id: 6876, name: "Placed App"},
        ],
        Phones: [
          {id: 672, name: "option1"},
          {id: 97249, name: "Placed},
        ],
        Food: [
          {id: 772, name: "option1"},
          {id: 6777, name: "Placed},
        ], 
      }
    }  

Проблема в том, что у меня могут быть одни и те же данные в dataFirst и dataSecond, например, «Еда», у меня есть 2 объекта массива, которые содержат разные данные, но мне нужно сделать его одним объектом «Еда» с данными из двух из них, из dataFirst «Еда» и dataSecond «Еда». У меня был такой код:

export const parser = ({ data }) => {
  const result = Object.values(data).reduce((prev, topicsGroup) => {
    Object.assign(prev, topicsGroup);
    return prev;
  }, {});
  return result;
}

но этот код не объединяет 2 объекта Food, а возвращает данные только из объекта dataFirst Food без второго.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете перебирать все значения вашего основного объекта данных с помощью Object.values(data) и объединять их с reduce, объединяя массивы, соответствующие общим ключам:

let data = {
  dataFirst: {
    Food: [{
      id: 536131,
      name: "option1",
    }]
  },
  dataSecond: {
    Autos: [{
      topicId: 678,
      name: 'option1'
    }],
    Houses: [{
        topicId: 6876,
        name: "option1"
      },
      {
        topicId: 6876,
        topicName: "Placed App"
      },
    ],
    Phones: [{
        topicId: 672,
        name: "option1"
      },
      {
        topicId: 97249,
        name: "Placed"
      },
    ],
    Food: [{
        topicId: 772,
        name: "option1"
      },
      {
        topicId: 6777,
        name: "Placed"
      },
    ],
  }
};


let res = Object.values(data).reduce((acc, curr) => {
  Object.entries(curr).forEach(([k, v]) => {
    if (k in acc) acc[k] = acc[k].concat(v);
    else acc[k] = v;
  });
  return acc;
}, {});

console.info(res);

Другие вопросы по теме