Сбой цикла While внутри рекурсивной функции при повторном цикле более одного раза

#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 — Это ответило на ваш вопрос? Если это так, вы можете сообщить об этом сообществу, нажав на галочку слева от ответа, и это также принесет вам несколько очков репутации здесь за соблюдение надлежащей процедуры.