Как из массива объектов создать объект с ключами

Из API ответа я получаю данные в виде:

const arr = [
{
    product_id: 1,
    name: 'John'
},
{
    product_id: 1,
    name: 'Jane'
},
{
    product_id: 2,
    name: 'Mark'
},
{
    product_id: 2,
    name: 'Thomas'
}]

Для построения категорий товаров в React компонентах было бы удобнее остортировать данные в следующем виде:

const obj = {
1: [
    {
        product_id: 1,
        name: 'John'
    },
    {
        product_id: 1,
        name: 'Jane'
    }
],
2: [
    {
        product_id: 2,
        name: 'Mark'
    },
    {
        product_id: 2,
        name: 'Thomas'
    }
]

Вопрос соответствующий: как это можно грамотно сделать?


Ответы (1 шт):

Автор решения: Igor

const arr = [
  { product_id: 1, name: 'John' },
  { product_id: 1, name: 'Jane' },
  { product_id: 2, name: 'Mark' },
  { product_id: 2, name: 'Thomas' }
];
const obj = arr.reduce(
  (r, i) => ((r[i.product_id] || (r[i.product_id] = [])).push(i), r), 
  {}
);
console.log(obj);

const arr = [
  { product_id: 1, name: 'John' },
  { product_id: 1, name: 'Jane' },
  { product_id: 2, name: 'Mark' },
  { product_id: 2, name: 'Thomas' }
];

const obj = {};
for (let i = 0; i < arr.length; i++) {
  let key = arr[i].product_id;
  let items = obj[key];
  if (!items) {
    items = [];
    obj[key] = items;
  }
  items.push(arr[i]);
}
console.log(obj);

→ Ссылка