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));
添加回答
舉報