如何将含嵌套对象的复杂设备数据转换为指定格式CSV文件?
如何将嵌套对象数组转换为指定格式的CSV二维数组
看起来你需要把嵌套的设备传感器数据转换成特定格式的二维数组来导出CSV,我来帮你梳理思路并写出可行的代码。
输入数据
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 rows = [ ["DeviceA"], ["Date/Time", "smokeSensor", "fireSensor"], ["190501 00:01", "200", "700"], ["190501 00:02", "300", "750"], ["190502 00:01", "20", "780"], ["190502 00:02", "30", "630"], [""], ["DeviceB"], ["Date/Time", "smokeSensor", "fireSensor"], ["190601 00:01", "100", "600"], ["190601 00:02", "110", "522"], ["190602 00:01", "120", ""], ["190602 00:02", "130", ""], ];
你的尝试问题分析
你当前的代码把所有设备和传感器的数据混在了一起,没有按设备分组,也没有对应每个时间点的两个传感器值,所以输出不符合预期。我们需要按设备→日期→时间点的层级来整理数据,同时要处理不同传感器可能缺失某些日期/时间点的情况。
解决方案代码
下面是可以生成目标格式的代码,我会逐段解释:
const data = { /* 你的输入数据 */ }; const rows = []; // 遍历每个设备 for (const deviceName in data) { // 1. 添加设备名称行 rows.push([deviceName]); // 2. 添加表头行 rows.push(["Date/Time", "smokeSensor", "fireSensor"]); // 收集当前设备所有的日期和时间点,避免遗漏 const timePoints = new Map(); const sensors = data[deviceName]; // 遍历每个传感器,提取所有日期+时间点,并记录对应值 for (const sensorType in sensors) { sensors[sensorType].forEach(dateEntry => { const date = Object.keys(dateEntry)[0]; const timeEntries = dateEntry[date]; for (const timeCode in timeEntries) { // 格式化时间:0001 → 00:01 const formattedTime = `${timeCode.slice(0,2)}:${timeCode.slice(2)}`; const fullDateTime = `${date} ${formattedTime}`; // 如果这个时间点还没在Map里,初始化一个空对象 if (!timePoints.has(fullDateTime)) { timePoints.set(fullDateTime, { smokeSensor: "", fireSensor: "" }); } // 给对应传感器赋值 timePoints.get(fullDateTime)[sensorType] = timeEntries[timeCode].toString(); } }); } // 将Map中的时间点转换成行(如需排序可在此处处理) timePoints.forEach((values, dateTime) => { rows.push([dateTime, values.smokeSensor, values.fireSensor]); }); // 添加空行分隔不同设备(最后一个设备可按需移除) rows.push([""]); } // 移除最后一行多余的空行 if (rows[rows.length - 1][0] === "") { rows.pop(); } console.log(rows);
代码解释
- 设备层级遍历:先循环每个设备,依次添加设备名称行和表头行。
- 收集时间点:用
Map存储每个格式化后的日期时间对应的传感器值,自动去重的同时,给缺失值默认填充空字符串。 - 时间格式化:把
0001这类时间码转换成00:01,拼接成190501 00:01的可读格式。 - 填充传感器值:遍历每个传感器的日期和时间点,把对应值填充到Map的对应条目里。
- 生成数据行:把Map中的每个条目转换成二维数组的一行,最后用空行分隔不同设备。
运行这段代码后就能得到你需要的目标二维数组,后续可以用rows.map(row => row.join(',')).join('\n')直接转换成CSV字符串导出。
内容的提问来源于stack exchange,提问作者LotTaeza
相关产品推荐
相关产品推荐

