为了账号安全,请及时绑定邮箱和手机立即绑定

如何将具有嵌套对象复杂的数组对象转换为 CSV 文件

如何将具有嵌套对象复杂的数组对象转换为 CSV 文件

幕布斯6054654 2021-06-11 18:47:07
我需要帮助。我想循环数组嵌套对象如下图 1 并将数据变为 array2D 以将数据转换为 CSV 文件,但我不太了解循环我的数据以获取详细信息成为 array2D。或者任何人都可以通过其他方式将数据导出到 CSV 文件,并具有这样的输出。图1: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        },      }    ]  },};这是我想用 array2D 获得的输出,以将其用于将 array2D 转换为 CSV 文件的函数。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"],  ["190501 00:01", "100", "600"],  ["190501 00:02", "110", "522"],  ["190502 00:01", "120", ""],  ["190502 00:02", "130", ""],];这是我尝试循环的代码,但在循环每个循环以获取日期时间值的每个细节时,我感到非常茫然。不幸的是,我得到了不符合要求的细节。
查看完整描述

1 回答

?
ABOUTYOU

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));


查看完整回答
反对 回复 2021-06-24
  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信