使用嵌套键减少对象的Javascript数组

时间:2020-05-04 07:05:29

标签: javascript arrays json object

我有以下包含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 :(得分:0)

由于每个日期只有一种产品,您可以直接指定目标。

在您的方法中,您用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; }