我有以下对象,其中的数组为值:
{
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个对象。)
映射对象的值并创建数组的最佳方法是什么?
答案 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})
, {})
);