gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:15:20 25 4
gpt4 key购买 nike

我需要一些帮助。我想如下图 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", ""],
];

这是我尝试循环的代码,但一旦循环每个循环以获取日期时间值的每个详细信息,我就会感到很茫然。不幸的是,我得到的细节不是我想要的。

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

关于javascript - 如何将具有嵌套对象复杂的数组对象转换为 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56511700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com