arrays - 如何从json中提取多层数组
问题描述
我有一个类似于以下架构的 JSON 响应...
{
"resultCode": 200,
"message": "Success",
"generated": "2018-11-14T18:42:02",
"expires": "2018-11-14T18:50:00",
"data": {
"generationByFuel": [
{
"date": "2018-11-14T00:00:00",
"period": 37,
"generation": [
{
"fuel": "Hydro",
"generation": 1011.298,
"capacity": 2000
},
{
"fuel": "Wind",
"generation": 2544.788,
"capacity": 3500
}
]
},
{
"date": "2018-11-14T00:00:00",
"period": 36,
"generation": [
{
"fuel": "Hydro",
"generation": 1100,
"capacity": 2000
},
{
"fuel": "Wind",
"generation": 2500,
"capacity": 3500
}
]
}
]
}
}
由此,我需要提取多个数组,这些数组将插入到 googlesheet(“shtGen”)中,填充以下列:
| 日期 | 期间 | 燃料 | 一代 | 容量 | 运行时 |
我猜我需要做的是写一些输出的东西,(generationByFuel[i](generation[r]))
但我正在努力弄清楚如何做到这一点。
我尝试了多种选择,但以下是我认为我走在正确轨道上的最后一次努力。也就是说,该函数运行时不会返回错误,但不会将任何信息插入到谷歌表中。当我使用调试器运行该函数时,也会发生同样的事情。
// define output to paste into sheet
for (var i in genData) {
var iInput = [];
iInput.push(genData[i].date);
iInput.push(genData[i].period);
for (var r in fuelData) {
var rInput = [];
rInput.push(fuelData[r].fuel);
rInput.push(fuelData[r].capacity);
rInput.push(fuelData[r].generation);
rInput.push(now = new Date());
shtGen.appendRow(iInput + rInput);
}
}
任何帮助或建议将不胜感激。提前致谢!
解决方案
这个改装怎么样?我认为您的情况有几种解决方案。因此,请将此视为其中之一。
修改点:
fuelData
需要在第一个 for 循环中声明。- @Slai 提到了这一点。
iInput + rInput
变成字符串类型。这样,在 处发生错误appendRow()
。iInput.concat(rInput)
用于此。
- 为了安排到
| Date | Period | Fuel | Generation | Capacity | Runtime |
,推送值的顺序需要是rInput.push(fuelData[r].fuel)
rInput.push(fuelData[r].generation)
rInput.push(fuelData[r].capacity)
在这个修改后的脚本中,obj
您的问题中是否有您的 json 对象。然后shtGen
假设工作表对象。
修改后的脚本:
var obj = {### your json object ###};
var genData = obj.data.generationByFuel;
for (var i in genData) {
var iInput = [];
iInput.push(genData[i].date);
iInput.push(genData[i].period);
var fuelData = genData[i].generation; // Added
for (var r in fuelData) {
var rInput = [];
rInput.push(fuelData[r].fuel); // Modified
rInput.push(fuelData[r].generation); // Modified
rInput.push(fuelData[r].capacity); // Modified
rInput.push(new Date());
shtGen.appendRow(iInput.concat(rInput)); // Modified
}
}
我认为当对象很大时,appendRow()
成为工艺成本增加的原因。所以我建议setValues()
用于将值放入电子表格,如下所示。
var obj = {### your json object ###};
var res = [];
var genData = obj.data.generationByFuel;
for (var i in genData) {
var iInput = [];
iInput.push(genData[i].date);
iInput.push(genData[i].period);
var fuelData = genData[i].generation;
for (var r in fuelData) {
var rInput = [];
rInput.push(fuelData[r].fuel);
rInput.push(fuelData[r].generation);
rInput.push(fuelData[r].capacity);
rInput.push(new Date());
res.push(iInput.concat(rInput)); // Modified
}
}
shtGen.getRange(shtGen.getLastRow() + 1, 1, res.length, res[0].length).setValues(res); // Added
其他图案:
作为其他修改之一,您还可以使用以下脚本。此脚本的成本低于上述脚本。
var obj = {### your json object ###};
var res = obj.data.generationByFuel.reduce(function(ar, e) {
return ar.concat(e.generation.map(function(f) {
return [e.date, e.period, f.fuel, f.generation, f.capacity, new Date()];
}));
}, []);
shtGen.getRange(shtGen.getLastRow() + 1, 1, res.length, res[0].length).setValues(res);
参考:
如果这不是你想要的,请告诉我。我想修改它。
推荐阅读
- python - Python 单元素集到 JSON
- c# - 如果我的布尔值始终为真,我将如何检查单个灯
- javascript - 单击React js中的按钮时如何获取innerHTML?
- arrays - 在 Julia 中连接多维数组
- javascript - 如何修复 Not a number 值?
- cmake - 找不到路径中的 CMake 编译器
- javascript - 如何使用复选框隐藏函数内的元素?
- listview - Flutter ListView 与不同的小部件和列表项
- javascript - 如何单击具有 Javascript 无法识别的自定义 ID 的按钮?如果没有名称或标签或ID,可以这样做吗?
- python - 如何访问字典中的列表值