【发布时间】:2020-10-20 13:17:13
【问题描述】:
我有如下的 IoT 读数 JSON:
[
{
"datetime": "2020-06-29T23:59:59.000Z",
"Benzene": 1.9
},
{
"datetime": "2020-06-30T00:59:59.000Z",
"Benzene": 0.6
},
{
"datetime": "2020-06-30T01:59:59.000Z",
"Benzene": 5.7
},
{
"datetime": "2020-06-30T02:59:59.000Z",
"Benzene": 5.5
},
{
"datetime": "2020-06-30T03:59:59.000Z",
"Benzene": 5.2
},
{
"datetime": "2020-06-30T04:59:59.000Z",
"Benzene": 1
},
{
"datetime": "2020-06-30T05:59:59.000Z",
"Benzene": 2.1
},
{
"datetime": "2020-06-30T06:59:59.000Z",
"Benzene": 4.2
},
{
"datetime": "2020-06-30T07:59:59.000Z",
"Benzene": 3.4
},
{
"datetime": "2020-06-30T00:59:59.000Z",
"NO2": 16.3
},
{
"datetime": "2020-06-30T01:59:59.000Z",
"NO2": 12.6
},
{
"datetime": "2020-06-30T02:59:59.000Z",
"NO2": 11.7
},
{
"datetime": "2020-06-30T03:59:59.000Z",
"NO2": 35.5
},
{
"datetime": "2020-06-30T04:59:59.000Z",
"NO2": 44.6
},
{
"datetime": "2020-06-30T05:59:59.000Z",
"NO2": 19.9
},
{
"datetime": "2020-06-30T06:59:59.000Z",
"NO2": 11.2
},
{
"datetime": "2020-06-30T07:59:59.000Z",
"NO2": 8.2
},
{
"datetime": "2020-06-29T23:59:59.000Z",
"O3": 25.6
},
{
"datetime": "2020-06-30T01:59:59.000Z",
"O3": 31.7
},
{
"datetime": "2020-06-30T02:59:59.000Z",
"O3": 35.1
},
{
"datetime": "2020-06-30T03:59:59.000Z",
"O3": 11.4
},
{
"datetime": "2020-06-30T04:59:59.000Z",
"O3": 4.9
},
{
"datetime": "2020-06-30T05:59:59.000Z",
"O3": 32.8
},
{
"datetime": "2020-06-30T06:59:59.000Z",
"O3": 46.4
},
{
"datetime": "2020-06-30T07:59:59.000Z",
"O3": 55.6
}
]
我想通过仅按日期对数据进行分组来转换 JSON 架构,并在其中显示同一日期时间的所有读数(苯、O3、NO2)到一个对象中,如下所示:
[
{
"date": "2020-06-29",
"values": [
{
"Benzene": 1.9,
"t": "2020-06-29T23:59:59.000Z",
"O3": 25.6
}
]
},
{
"date": "2020-06-30",
"values": [
{
"Benzene": 0.6,
"t": "2020-06-30T00:59:59.000Z",
"NO2": 16.3
},
{
"Benzene": 5.7,
"t": "2020-06-30T01:59:59.000Z",
"NO2": 12.6,
"O3": 31.7
},
{
"Benzene": 5.5,
"t": "2020-06-30T02:59:59.000Z",
"NO2": 11.7,
"O3": 35.1
},
{
"Benzene": 5.2,
"t": "2020-06-30T03:59:59.000Z",
"NO2": 35.5,
"O3": 11.4
},
{
"Benzene": 1,
"t": "2020-06-30T04:59:59.000Z",
"NO2": 44.6,
"O3": 4.9
},
{
"Benzene": 2.1,
"t": "2020-06-30T05:59:59.000Z",
"NO2": 19.9,
"O3": 32.8
},
{
"Benzene": 4.2,
"t": "2020-06-30T06:59:59.000Z",
"NO2": 11.2,
"O3": 46.4
},
{
"Benzene": 3.4,
"t": "2020-06-30T07:59:59.000Z",
"NO2": 8.2,
"O3": 55.6
}
]
}
]
我使用了以下方法可能非常多余并且不是特别有效。 (json_from_csv_filtered 包含顶部报告的原始 JSON)
const data = Object.values(json_from_csv_filtered.reduce((groups, {
datetime,
...rest
}) => {
if (!groups[datetime]) {
groups[datetime] = {}
}
key = Object.keys({
...rest
})
value = Object.values({
...rest
})
groups[datetime][key[0]] = value[0];
groups[datetime]['t'] = datetime
return groups;
}, []));
const result = data.reduce((groups, readings) => {
const date = readings.t.split('T')[0];
if (!groups[date]) {
groups[date] = [];
}
groups[date].push(readings);
return groups;
}, {})
const groupArrays = Object.keys(result).map((date) => {
return {
date,
values: result[date]
};
});
console.log(JSON.stringify(groupArrays, null, 2));
谁能提出更好的方法? 而且't'键,代表读数的日期时间,不知道为什么,总是出现在'Benzene'键之后,我想应该是相反的。
谢谢。
【问题讨论】:
-
请查看您上一篇文章的answer。
标签: javascript node.js arrays json grouping