1 回答
TA贡献1812条经验 获得超5个赞
你可以使用类似下面的函数。该方法是迭代结构的键,按时间和小时/分钟字符串对传感器值进行分组,并将每个设备转储到结果行中。根据您的规范,进行了一些填充以确保行的宽度相同。
稍微清理一下不会有什么坏处,但它似乎可以完成工作(我假设您的 DeviceB 输出是 上的错字"190501",这应该"190601"基于您的输入数据)。
var data = { deviceA: { smokeSensor: [ { '190501': { '0001': 200, '0002': 300 }, }, { '190502': { '0001': 20, '0002': 30 }, } ], fireSensor: [ { '190501': { '0001': 700, '0002': 750 }, }, { '190502': { '0001': 780, '0002': 630 }, } ] }, deviceB: { smokeSensor: [ { '190601': { '0001': 100, '0002': 110 }, }, { '190602': { '0001': 120, '0002': 130 }, } ], fireSensor: [ { '190601': { '0001': 600, '0002': 522 }, } ] }, };
const dataToCSV = data => {
const rows = [];
for (const device in data) {
rows.push(
[device.replace(/^./, m => m.toUpperCase())],
["Date/Time", ...Object.keys(data[device])]
);
const groups = {};
let longest = 0;
for (const sensor in data[device]) {
for (const time of data[device][sensor]) {
const k = Object.keys(time)[0];
for (const hm in time[k]) {
const groupKey = `${k} ${hm.replace(/(\d\d)(\d\d)/, "$1:$2")}`;
if (!(groupKey in groups)) {
groups[groupKey] = [groupKey];
}
groups[groupKey].push("" + time[k][hm]);
longest = Math.max(longest, groups[groupKey].length);
}
}
}
for (const group of Object.values(groups)) {
while (group.length < longest) {
group.push("");
}
rows.push(group);
}
rows.push([""]);
}
return rows.slice(0, -1);
};
console.log(dataToCSV(data));
添加回答
举报