首页 > 解决方案 > 将对象的 Pivot 或 GroupBy 对象转换为 Javascript 中的对象数组

问题描述

我有以下 JavaScript 对象。我需要从给定的对象生成一个新的对象数组。我应该在 JavaScript 中采用什么方法?

const ObjOfObj = {
  'virus': [
    {
      '2016': 67,
      '2017': 59,
      '2018': 18,
      '2019': 1
    }
  ],
  'cure': [
    {
      '2016': 51,
      '2017': 50,
      '2018': 16,
      '2019': 1
    }
  ]
};

如何转换或旋转以生成以下对象数组?

const ArrOfObj = [
  {'year': '2016', 'virus': 67, 'cure' : 51},
  {'year': '2017', 'virus': 59, 'cure' : 50},
  {'year': '2018', 'virus': 18, 'cure' : 16},
  {'year': '2019', 'virus': 1, 'cure' : 1},
]

标签: javascriptjson

解决方案


你可以使用这样的reduce函数。

const ObjOfObj = {
  'virus': [
    {
      '2016': 67,
      '2017': 59,
      '2018': 18,
      '2019': 1
    }
  ],
  'cure': [
    {
      '2016': 51,
      '2017': 50,
      '2018': 16,
      '2019': 1
    }
  ]
};

const groupBy = (obj) => {
  const keys = Object.keys(obj);
  const mapping = keys.reduce((acc, k) => {
    obj[k].forEach(item => {
      Object.keys(item).forEach(yearKey => {
        tracked = acc[yearKey];
        if (!tracked) {
          acc[yearKey] = {
            year: yearKey
          };
        }
        acc[yearKey][k] = (acc[yearKey][k] | 0) + item[yearKey];
      });
    });
    return acc;
  }, {});
  return Object.entries(mapping);
};

console.log(groupBy(ObjOfObj));

推荐阅读