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

Javascript 如何将具有嵌套对象复合体的数组对象转换为CSV文件,javascript,arrays,object,ecmascript-6,export-to-csv,Javascript,Arrays,Object,Ecmascript 6,Export To Csv,我需要一些帮助。我想删除数组嵌套对象,如下图1所示,并将数据转换为array2D以将数据转换为CSV文件,但我不太了解如何循环数据以将详细信息转换为array2D。或者,任何人都可以通过其他方式将数据导出到CSV文件,并以如下方式输出 图1: 这是我希望通过array2D获得的输出,并将其抛出函数convert array2D to CSV file const rows = [ ["DeviceA"] ["Date/Time", "smokeSensor", "fireSensor"

我需要一些帮助。我想删除数组嵌套对象,如下图1所示,并将数据转换为array2D以将数据转换为CSV文件,但我不太了解如何循环数据以将详细信息转换为array2D。或者,任何人都可以通过其他方式将数据导出到CSV文件,并以如下方式输出


图1:

这是我希望通过array2D获得的输出,并将其抛出函数convert array2D to CSV file

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", ""],
];
这是我尝试循环的代码,但我在循环每个循环以获得日期-时间值的每个细节时感到非常困惑。不幸的是,我得到的细节不是我想要的

var dataCSV = []
var mdbName = []
var header = ['DateTime']
var content = []
var dateTime = ''
for (var deviceId in data) {
  mdbName.push(deviceId)
  for (var sensorName in data[deviceId]) {
    header.push(sensorName)
    // console.log(data[deviceId][sensorName]);
    Object.keys(data[deviceId][sensorName]).forEach(item => {
      let date = data[deviceId][sensorName][item]
      for (var key3 in date) {
        // console.log(key3)
        for (var key4 in date[key3]) {
          dateTime = key3 + key4
          // console.log(deviceId + ': ' + sensorName + ': ' + dateTime + ':' + date[key3][key4])
          content.push(date[key3][key4])
        }
      }
    })
  }
}
dataCSV.push(mdbName)
dataCSV.push(header)
dataCSV.push(content)
console.log('End: ', dataCSV)
这是我的错误输出:

[ 
  [ 'deviceA', 'deviceB' ],
  [ 'DateTime', 'smokeSensor', 'fireSensor', 'smokeSensor', 'fireSensor' ],
  [ 200, 300, 20, 30, 700, 750, 780, 630, 100, 110, 120, 130, 600, 522 ] 
]

您可以使用如下函数。该方法是迭代结构的键,根据时间和小时/分钟字符串对传感器值进行分组,并将每个设备转储到结果行中。根据您的规范,进行一些填充以确保行的宽度相同

稍微清理一下不会有什么坏处,但似乎可以完成工作(我假设您的DeviceB输出是
“190501”
,根据您的输入数据,它应该是
“190601”

var数据={deviceA:{smokeSensor:[{'190501':{'0001':200,'0002':300},},{'190502':{'0001':20,'0002':30},},fireSensor:[{'190501':{'0001':700,'0002':750},},{'190502':{'0001':780,'0002':630},},deviceB:{'190601{'0001':120,'0002':130},}],火灾传感器:[{'190601':{'0001':600,'0002':522},}];
const dataToCSV=data=>{
常量行=[];
for(数据中的常量设备){
推(
[device.replace(/^./,m=>m.toUpperCase())],
[“日期/时间”,…对象.键(数据[设备])]
);
常量组={};
设最长=0;
对于(数据[设备]中的常数传感器){
for(数据[设备][传感器]的常数时间){
常数k=对象键(时间)[0];
用于(时间常数[k]){
constgroupkey=`${k}${hm.replace(/(\d\d)(\d\d)/,“$1:$2”)}`;
如果(!(组中的组键)){
组[groupKey]=[groupKey];
}
组[groupKey].push(“+time[k][hm]);
最长=Math.max(最长,组[groupKey].length);
}
}
}
for(对象的常量组。值(组)){
而(组长度<最长){
组。推送(“”);
}
行。推(组);
}
行。推送([“”]);
}
返回行。切片(0,-1);
};

console.log(dataToCSV(data));
当前输出是什么?这是我的当前输出[['deviceA','deviceB'],['DateTime','smokessensor','firessensor','smokessensor','firessensor'],[200,300,20,30,700,750,780,630,100,110,120,130,600,522]]非常感谢我的工作,你是对的,我为DeviceB输入了错误的日期,实际上它应该与DeviceA相同。还有一个问题。如果我有一个日期和时间作为数字类型的值,我必须在你的代码中更改什么。
[ 
  [ 'deviceA', 'deviceB' ],
  [ 'DateTime', 'smokeSensor', 'fireSensor', 'smokeSensor', 'fireSensor' ],
  [ 200, 300, 20, 30, 700, 750, 780, 630, 100, 110, 120, 130, 600, 522 ] 
]