将具有数组作为值的对象映射到对象数组

时间:2020-03-22 15:42:16

标签: javascript arrays javascript-objects

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

{
  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个对象。)

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

3 个答案:

答案 0 :(得分:1)

您可以仅使用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; }

答案 1 :(得分:0)

您可以获取条目,然后迭代数组。

此方法将对象用作哈希表,并且仅返回哈希表的值。

var 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 }] },
    result = Object.values(Object.entries(data).reduce((r, [k, v]) => {
        v.forEach(({ date, number }) => (r[date] = r[date] || { date })[k] = number);
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

我可能很愚蠢,但是当我做这种事情时我需要占用更多空间。

在这种情况下,我还想确保日期是唯一的,所以我要使这部分代码脱颖而出。

// include the key in the entries and flatten the array
const flat = Object.entries(data).flatMap(([key, values]) =>
    values.map(({number, date}) => ({number, date, key}))
, []);

// extract a set of dates
const dates = new Set(flat.map(entry => entry.date));

// bind the dates and their data in a 2d array
const table = Array.from(dates).map(date => 
    flat.filter(entry => entry.date === date)
);

// reduce the second dimension to an object
const merged = table.map(row => 
    row.reduce((obj, {date, key, number}) =>
        Object.assign(obj, {date, [key]: number})
    , {})
);