将 JavaScript 对象重组为具有命名键的对象数组
Restructure JavaScript object into array of objects with named keys
我有以下 JavaScript 对象:
const groupedData = {
"1":[
{"x":"2021-02-05","y":1},
{"x":"2021-02-05","y":1},
{"x":"2021-02-06","y":1}
],
"2":[
{"x":"2021-02-05","y":1},
{"x":"2021-02-06","y":1},
{"x":"2021-02-07","y":1},
{"x":"2021-02-07","y":1},
{"x":"2021-02-07","y":1},
{"x":"2021-02-08","y":1}
]
}
我想按 x
对每个数组中的对象进行分组并按 y
求和,并将数据塑造成略有不同的结构,以便图表库可以使用它.我有以下函数可以成功进行分组和求和:
const formattedData = [];
Object.keys(groupedData).map((key) => {
var totals = groupedData[key].reduce(function (r, o) {
(r[o.x]) ? r[o.x] += o.y : r[o.x] = o.y;
return r;
}, {});
formattedData.push({ 'name': key, 'data': totals })
});
这会输出以下内容:
[
{
"name":"1",
"data": {
"2021-02-05":2,
"2021-02-06":1
}
},
{
"name":"2",
"data": {
"2021-02-05":1,
"2021-02-06":1,
"2021-02-07":3,
"2021-02-08":1
}
}
]
但是,我希望数据采用以下格式:
[
{
"name":"1",
"data":[
{"x":"2021-02-05","y":2},
{"x":"2021-02-06","y":1}
]
},
{
"name":"2",
"data":[
{"x":"2021-02-05","y":1},
{"x":"2021-02-06","y":1},
{"x":"2021-02-07","y":3},
{"x":"2021-02-08","y":1}
]
}
]
我正在努力想出一种巧妙的方法来完成格式化的最后一部分。谁能建议如何修改格式化功能以巧妙地实现这最后一步?
非常感谢
您可以映射对象的条目并对值进行分组。
const
data = { 1: [{ x: "2021-02-05", y: 1 }, { x: "2021-02-05", y: 1 }, { x: "2021-02-06", y: 1 }], 2: [{ x: "2021-02-05", y: 1 }, { x: "2021-02-06", y: 1 }, { x: "2021-02-07", y: 1 }, { x: "2021-02-07", y: 1 }, { x: "2021-02-07", y: 1 }, { x: "2021-02-08", y: 1 }] },
result = Object.entries(data).map(([name, data]) => ({
name,
data: Object.values(data.reduce((r, { x, y }) => {
r[x] ??= { x, y: 0 };
r[x].y += y;
return r;
}, {}))
}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我有以下 JavaScript 对象:
const groupedData = {
"1":[
{"x":"2021-02-05","y":1},
{"x":"2021-02-05","y":1},
{"x":"2021-02-06","y":1}
],
"2":[
{"x":"2021-02-05","y":1},
{"x":"2021-02-06","y":1},
{"x":"2021-02-07","y":1},
{"x":"2021-02-07","y":1},
{"x":"2021-02-07","y":1},
{"x":"2021-02-08","y":1}
]
}
我想按 x
对每个数组中的对象进行分组并按 y
求和,并将数据塑造成略有不同的结构,以便图表库可以使用它.我有以下函数可以成功进行分组和求和:
const formattedData = [];
Object.keys(groupedData).map((key) => {
var totals = groupedData[key].reduce(function (r, o) {
(r[o.x]) ? r[o.x] += o.y : r[o.x] = o.y;
return r;
}, {});
formattedData.push({ 'name': key, 'data': totals })
});
这会输出以下内容:
[
{
"name":"1",
"data": {
"2021-02-05":2,
"2021-02-06":1
}
},
{
"name":"2",
"data": {
"2021-02-05":1,
"2021-02-06":1,
"2021-02-07":3,
"2021-02-08":1
}
}
]
但是,我希望数据采用以下格式:
[
{
"name":"1",
"data":[
{"x":"2021-02-05","y":2},
{"x":"2021-02-06","y":1}
]
},
{
"name":"2",
"data":[
{"x":"2021-02-05","y":1},
{"x":"2021-02-06","y":1},
{"x":"2021-02-07","y":3},
{"x":"2021-02-08","y":1}
]
}
]
我正在努力想出一种巧妙的方法来完成格式化的最后一部分。谁能建议如何修改格式化功能以巧妙地实现这最后一步?
非常感谢
您可以映射对象的条目并对值进行分组。
const
data = { 1: [{ x: "2021-02-05", y: 1 }, { x: "2021-02-05", y: 1 }, { x: "2021-02-06", y: 1 }], 2: [{ x: "2021-02-05", y: 1 }, { x: "2021-02-06", y: 1 }, { x: "2021-02-07", y: 1 }, { x: "2021-02-07", y: 1 }, { x: "2021-02-07", y: 1 }, { x: "2021-02-08", y: 1 }] },
result = Object.entries(data).map(([name, data]) => ({
name,
data: Object.values(data.reduce((r, { x, y }) => {
r[x] ??= { x, y: 0 };
r[x].y += y;
return r;
}, {}))
}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }