Я написал эту рекурсивную функцию, которая вела себя странно, мне потребовалось несколько часов, чтобы она заработала. Я использую его для обхода объекта JSON, такого как древовидная структура, для поиска узлов, которые имеют значение в schedulePoint. Я заметил кое-что, что немного сбило меня с толку, и я надеялся, что кто-то сможет пролить свет на то, почему. Я прокомментировал код ниже, в котором была проблема. Для меня, по крайней мере, логически, это не выглядит иначе. Тем не менее, когда я использовал закомментированный код вместо этого, рекурсия не завершалась, я продолжал получать пустой массив. Он будет go через одно поддерево, затем очистит массив перед запуском следующего. Я просто хотел бы знать, как влияет использование переменной на рекурсию. Любая помощь будет оценена. Он написан на DGScript, языке сценариев, похожем на javascript. Кроме того, если вы видите что-то лишнее или что можно было бы написать более эффективно, я был бы признателен за совет.
function findSchedules(name, jsonNode)
{
if (hasChildren(jsonNode) == false)
{
data = csvToJSON(jsonNode['?value']);
dataPath = data['dataPath'];
schedulePoint = data['schedulePoint'];
if (schedulePoint != "" && schedulePoint != null && schedulePoint != "NO SCHEDULE")
return [[name, dataPath, csvToJSON(jsonNode['?value'])['schedulePoint']]];
else
return [];
}
schedules = [];
for (node in jsonNode)
{
if (isValidNode(node) == true)
schedules = schedules.concat(findSchedules(node, jsonNode[node]));
/*
If instead I wrote:
if (isValidNode(node) == true)
{
prevSchedules = findSchedules(node, jsonNode[node]);
schedules = schedules.concat(prevSchedules);
}
which is what I had originally, the recursion would not work correctly. Why are these two
statements different?
*/
}
data = csvToJSON(jsonNode['?value']);
dataPath = data['dataPath'];
schedulePoint = data['schedulePoint'];
if (schedulePoint != "" && schedulePoint != null && schedulePoint != "NO SCHEDULE")
schedules.push([name, dataPath, schedulePoint]);
return schedules;
}