Andrew Blessing Manyore Ответов: 1

Рекурсивная функция вызывается не на каждой итерации


Я пытаюсь реализовать рекурсивную функцию в JQuery. Вместо того чтобы возвращать серию объектов, рекурсивная функция возвращает только один объект(что заставляет меня предположить, что она выполняет только один рекурсивный вызов).
//recursive function to find every Base Child 
function GetBaseChild(node)
{
    if(node.hasOwnProperty("children")){
        for(var i = 0; i < node.children.length; i++){
            return GetBaseChild(node.children[i]);
        }
    }else{
        return node;
    }
}


Я предполагаю, что возврат в моем падающем цикле останавливает мой цикл от перехода к следующему индексу и делает рекурсивный вызов, следовательно, одиночный вызов. Любая идея, как я могу это сделать.

Что я уже пробовал:

Первоначально я решил неопределенную ошибку из этой функции. Я попытался добавить оператор if внутри цикла for, чтобы проверить, находимся ли мы в конце цикла и возвращаем ли функцию, но все равно это не работает.
//recursive function to find every Base Child 
function GetBaseChild(node)
{
    if(node.hasOwnProperty("children")){
        for(var i = 0; i < node.children.length; i++){
            if(i < node.children.length -1){
                  GetBaseChild(node.children[i]);
               }else{
                  return GetBaseChild(node.children[i]);
               }
        }
    }else{
        return node;
    }
}


Это возвращает последний элемент моего ожидаемого результата.

Richard Deeming

Что бы вы ни положили после return ключевое слово-это то, что будет возвращено из вашей функции.

Ваша функция возвращает один результат. А чего вы ожидали от него?

Andrew Blessing Manyore

Я ожидаю, что он вернет около шести объектов из данных, которые у меня есть прямо сейчас. На самом деле я хочу, чтобы он выполнял рекурсивный вызов каждого объекта внутри массива.

Richard Deeming

Итак, вы хотите вернуть массив всех узлов?

Или передать каждый узел функции обратного вызова?

Andrew Blessing Manyore

Это не массив как таковой. Я ожидаю, что он вернет значения, которые я затем добавлю в массив, хотя я использовал подход массива, и он, кажется, работает.

Richard Deeming

Если вы хотите вернуть несколько значений, у вас действительно нет выбора - вы иметь чтобы использовать массив.

Единственной другой альтернативой было бы передать функцию обратного вызова и иметь GetBaseChild функция вызывает его для каждого узла.

function GetBaseChild(node, callback) {
    callback(node);
    
    if(node.hasOwnProperty("children")) {
        for(var i = 0; i < node.children.length; i++) {
            GetBaseChild(node.children[i], callback);
        }
    }
}

Andrew Blessing Manyore

Спасибо тебе за это. Я уже пробовал массивный подход, и он сработал для меня и его в моем решении.

Andrew Blessing Manyore

А также удаление возврата внутри моего цикла for, returns и объекта' undefined'.

1 Ответов

Рейтинг:
6

Andrew Blessing Manyore

Решение

После просмотра Интернета и чтения некоторых источников я понял, что J Query имеет некоторые ограничения. Моя проблема была вызвана тем фактом, что когда я использую return, то элемент управления вырывается из цикла и возвращается первый/последний результат в зависимости от логики, которую я использовал. А также учитывая тот факт, что J-запрос передает непримитивные типы в качестве ссылок, я решил передать массив, которым моя рекурсивная функция будет манипулировать и использовать его позже в моем коде. Вот исходный код.

//recursive function to find every Base Child
function GetBaseChild(array, node)
{
    if(node.hasOwnProperty("children")){
        for(var i = 0; i < node.children.length; i++){
            GetBaseChild(array, node.children[i]);
        }
    }else{
        array.push(node);
    }
}


PIEBALDconsult

Пожалуйста, не отвечай на свой вопрос. Используйте "улучшить вопрос", чтобы добавить детали и контекст.