Уменьшите массив Javascript объектов, используя вложенные ключи - PullRequest
1 голос
/ 04 мая 2020

У меня есть следующий массив, который содержит список javascript объектов. Я пытаюсь использовать функцию Reduce, чтобы преобразовать его в один объект с вложенными группировками клавиш.

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

[
  {
   "product": 1,
   "date": "2020-01-01",
   "price": 100
  },
  {
   "product": 2,
   "date": "2020-01-01",
   "price": 102
  },
  {
   "product": 1,
   "date": "2020-01-02",
   "price": 99
  },
  {
   "product": 2,
   "date": "2020-01-02",
   "price": 92
  },
  {
   "product": 1,
   "date": "2020-01-03",
   "price": 101
  },
  {
   "product": 2,
   "date": "2020-01-03",
   "price": 22
  }
]

И вот результат, которого я пытаюсь достичь:

{
 1:{
  "2020-01-01":{
    "product": 1,
    "date": "2020-01-01",
    "price": 100
  },
  "2020-01-02":{
    "product": 1,
    "date": "2020-01-02",
    "price": 99
  },
  "2020-01-03":{
    "product": 1,
    "date": "2020-01-03",
    "price": 101
  }
 },
 2:{
  "2020-01-01":{
    "product": 2,
    "date": "2020-01-01",
    "price": 102
  },
  "2020-01-02":{
    "product": 2,
    "date": "2020-01-02",
    "price": 92
  },
  "2020-01-03":{
    "product": 2,
    "date": "2020-01-03",
    "price": 22
  }
 }
}

Я попробовал следующее, но я получаю только одну дату для каждого продукта:

pricelist.reduce((obj, item) => {
   obj[item['product']] = {};
   obj[item['date']][item['product']] = item;
   return obj;
}, {});

Не могли бы вы помочь мне понять, что я делаю неправильно?

1 Ответ

0 голосов
/ 04 мая 2020

Имея только один продукт на дату, вы можете взять прямую цель для назначения.

В вашем подходе вы изменили product на date, и это не работает.

var pricelist = [{ product: 1, date: "2020-01-01", price: 100 }, { product: 2, date: "2020-01-01", price: 102 }, { product: 1, date: "2020-01-02", price: 99 }, { product: 2, date: "2020-01-02", price: 92 }, { product: 1, date: "2020-01-03", price: 101 }, { product: 2, date: "2020-01-03", price: 22 }],
    result = pricelist.reduce((obj, item) => {
        obj[item.product] = obj[item.product] || {};
        obj[item.product][item.date] = item;
        return obj;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...