#node.js #loops #recursion #while-loop
#node.js #циклы #рекурсия #цикл while
Вопрос:
Мой приведенный ниже код работает нормально, если условие цикла while равно <6 (т. Е. Один цикл), Но сбой, если для него установлено значение <7 или более (т. Е. Более 1 цикла)
var data = {
a: "abc",
c: 0
}
function recurse(data, nodes) {
const first = nodes.shift();
console.log("first-" first.id, first.t);
if (first.t == "action") {
data.c = data.c 1;
console.log("exec action", data.c);
} else {
switch (first.t) {
case "if_else":
console.log(recurse(data, first.b[0].actions), 300);
break
case "while":
var brNodes = first.b[0].actions
while (data.c < 7) {
console.log(recurse(data, brNodes), 400);
}
break
default:
break
}
}
return (nodes.length > 0)? console.log(recurse(data, nodes), 200): "Completed"
}
var actions = [
{id:1, t:"action", b:null},
{id:2, t:"action", b:null},
{id:3, t:"if_else", b:[{id:31, t:"branch", actions:[{id:311, t:"action", b:null}, {id:312, t:"action", b:null}]},{id:32, t:"branch", actions:[{id:321, t:"action", b:null}]}]},
{id:4, t:"action", b: null},
{id:5, t:"while", b:[{id:500, t:"branch", actions:[{id:511, t:"action", b:null}]}]},
{id:6, t:"action", b:null}
]
console.log(recurse(data, actions), 100)
Вот мое тестирование на StackBlitz https://stackblitz.com/edit/recurse?file=index.js
Комментарии:
1. Я не видел ни
data.c
одного поля в вашемactions
2. @ManuelSpigolon —
data
иdata.c
определяются в начале блока кода операционной системы.3. каков ожидаемый результат?
Ответ №1:
похоже, я сам это понял… массив был передан по ссылке, и после первого цикла он был преобразован в пустой массив. я заменил его на […] распространение
console.log(recurse(data, […first.b[0].actions]), 400);
и это должно быть решено
Ответ №2:
Ваш код делает это:
const first = nodes.shift();
И затем попытка доступа:
first.b[0].actions
И nodes.shift()
удаляет первый элемент из nodes
массива. Ваш массив узлов содержит 6 элементов. Если вы попытаетесь вызвать свою функцию 7 раз, установив условие while (data.c < 7)
равным, вы получите пустой nodes
массив и, следовательно undefined
first
, значение на последней итерации, и это вызовет ошибку, когда ваш код попытается получить доступ first.b[0].actions
на последней итерации.
Комментарии:
1. @kkgan — Это ответило на ваш вопрос? Если это так, вы можете сообщить об этом сообществу, нажав на галочку слева от ответа, и это также принесет вам несколько очков репутации здесь за соблюдение надлежащей процедуры.