首页 > 解决方案 > 将具有数组作为值的对象映射到对象数组

问题描述

我有以下以数组为值的对象:

{
  A: [{date: 21.01.2020, number: 4000}, {date: 22.01.2020, number: 3800}],

  B: [{date: 21.01.2020, number: 4000}, {date: 22.01.2020, number: 3800}],

  C: [{date: 21.01.2020, number: 4000}, {date: 22.01.2020, number: 3800}]
}

我的目标是将这些数据转换为对象数组:

[
 {
  "date": "21.01.2020",
  "A": 4000,
  "B": 4000,
  "C": 4000
 },
 {
  "date": "22.01.2020",
  "A": 3800,
  "B": 3800,
  "C": 3800
 }
]

我知道我可以使用以下方法从当前对象中获取单个键(A、B、C):

Object.keys(...)

我的问题是我不想通过当前对象本身进行映射,但我需要通过当前对象的值进行映射,包含我需要的数据的数组(初始对象包含3个键值对,目标是将其转换为 2 个对象)。

映射对象的值并创建数组的最佳方法是什么?

标签: javascriptarraysjavascript-objects

解决方案


您可以通过仅使用forEach. 在这种方法中,我首先按日期对数据进行分组,然后将对象的值返回到一个数组中。

const data = {
	A: [{date: '21.01.2020', number: 4000}, {date: '22.01.2020', number: 3800}],
	B: [{date: '21.01.2020', number: 4000}, {date: '22.01.2020', number: 3800}],
	C: [{date: '21.01.2020', number: 4000}, {date: '22.01.2020', number: 3800}]
};

const res = {};

// Group the data object by the date and make another object
Object.keys(data).forEach(key => {
    data[key].forEach(value => {
	if (typeof res[value.date] == 'undefined') {
	    res[value.date] = {};
	}
	res[value.date].date = value.date;
	res[value.date][key] = value.number;
    });
});

// Finally make the object as array of object
const output = Object.values(res);
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读