Вот альтернативный подход, который использует JSON.parse()
.
Функции Reviver являются необязательным параметром для JSON.parse()
.Крутая вещь в этих функциях заключается в том, что они вызываются парами ключ / значение для каждого узла в дереве объектов JSON с использованием поиска в глубину.
Запустите следующий фрагмент, чтобы понять, как это работает:
var jsonString = JSON.stringify({
"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
}
]
}
]
}
});
JSON.parse(jsonString, function(key, value) {
console.log("Key:%s, Value:%o", key, value);
return value;
});
Журнал консоли, сгенерированный вышеприведенным сценарием, "обходит" дерево объектов первым на глубину;он детализирует, чтобы распечатать значение конечных узлов, прежде чем он напечатает значение родительских узлов.Например: "fuel":"Hydro"
печатается перед массивом "generation":[{...}, {...},..]
, в котором он находится.
Вы можете использовать это для генерации необходимых данных для вашей электронной таблицы следующим образом:
var jsonString = JSON.stringify({
"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
}
]
}
]
}
});
var values = [];
var state = {};
JSON.parse(jsonString, function(key, value) {
switch(key) {
case "generation":
if (Array.isArray(value)) break;
case "date":
case "period":
case "fuel":
case "capacity":
state[key] = value;
break;
}
if (key === "capacity") {
values.push([
state.date,
state.period,
state.fuel,
state.generation,
state.capacity,
new Date()
]);
}
return value;
});
console.log(values);
Приведенный выше фрагмент кода отфильтровывает нужные данные, когда реаниматор обходит дерево объектов JSON и заполняет массив двумерных значений в процессе.Теперь все, что вам нужно сделать, это вызвать setValues()
на вашем листе с массивом значений.