Как создать рекурсивный метод

#javascript #recursion

#javascript #рекурсия

Вопрос:

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

Моя идея заключается в создании рекурсивного метода, который проверяет, что у него меньше дочерних элементов, чем максимальное значение.

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

 export const checkMaximumChildren = (hierarchy, maximum) => {
    let hasMoreThanMaximumChildren = false;

    if (hierarchy.children.length > maximum) {
        hasMoreThanMaximumChildren = true;
    } else {
        const dmaExtractor = (children) => {
            children.forEach((child) => {
                if (child.children.length > maximum) {
                    hasMoreThanMaximumChildren = true;
                    return hasMoreThanMaximumChildren;
                }

                if (
                    child amp;amp;
                    child.children amp;amp;
                    Array.isArray(child.children) amp;amp;
                    child.children.length > 0
                ) {
                    dmaExtractor(data.children);
                }
            });
        };

        if (
            hierarchy amp;amp;
            hierarchy.children amp;amp;
            Array.isArray(hierarchy.children) amp;amp;
            data.children.length > 0
        ) {
            dmaExtractor(hierarchy.children);
        }
    }

    return hasMoreThanMaximumChildren;
};

 const data =  [{
    "id": 1,
    "parentId": null,
    "selected": false,
    "children": [{
        "id": 2,
        "parentId": 1,
        "selected": false,
        "children": [{
            "id": 3,
            "parentId": 2,
            "selected": false,
            "children": [{
                "id": 4,
                "parentId": 3,
                "selected": false,
                "children": []
            }]
        }]
    }]
 }, {
    "id": 1,
    "parentId": null,
    "selected": true,
    "children": []
 }, {
    "id": 1,
    "parentId": null,
    "selected": true,
    "children": []
 }]
  

Редактировать

Извините, я тупой…

dmaExtractor(data.children); с помощью dmaExtractor(child.children);

Комментарии:

1. (оффтопик) что означает ветви ? И как мы должны протестировать ваш код?

2. ветви — это иерархия

Ответ №1:

Пожалуйста, взгляните на приведенный ниже код:

 export const checkMaximumChildren = (hierarchy, maximum) => {
    let hasMoreThanMaximumChildren = false;

    if (hierarchy.children.length > maximum) {
        hasMoreThanMaximumChildren = true;
    } else {
        const dmaExtractor = (children) => {
            children.forEach((child) => {
                if (child.children.length > maximum) {
                    hasMoreThanMaximumChildren = true;
                    return hasMoreThanMaximumChildren;
                }

                if (
                    child amp;amp;
                    child.children amp;amp;
                    Array.isArray(child.children) amp;amp;
                    child.children.length > 0
                ) {
                    return dmaExtractor(data.children); // change #1
                }
            });
        };

        if (
            hierarchy amp;amp;
            hierarchy.children amp;amp;
            Array.isArray(hierarchy.children) amp;amp;
            data.children.length > 0
        ) {
            hasMoreThanMaximumChildren = dmaExtractor(hierarchy.children); // change #2
        }
    }

    return hasMoreThanMaximumChildren;
};
  

Причиной вашего бесконечного цикла, вероятно, было то, что внутренний dmaExtractor метод ничего не возвращал.

Я тестировал это здесь, на узлах document DOM в консоли разработчика:

введите описание изображения здесь

Ответ №2:

Возможно, я здесь упускаю что-то важное, но почему бы не написать рекурсивную функцию для вычисления количества узлов в иерархии, а затем обернуть это функцией, чтобы определить, не больше ли это максимального значения?

Это:

 const countKids = (data = []) => 
  data .reduce ((total, node) => total   1   countKids (node .children || []), 0)

const checkMaximumChildren = (hierarchy, maximum) => 
  countKids (hierarchy) <= maximum

const data = [{id: 1, parentId: null, selected: false, children: [{id: 2, parentId: 1, selected: false, children: [{id: 3, parentId: 2, selected: false, children: [{id: 4, parentId: 3, selected: false, children: []}]}]}]}, {id: 1, parentId: null, selected: true, children: []}, {id: 1, parentId: null, selected: true, children: []}]

console .log (countKids (data) )
console .log (checkMaximumChildren (data, 5))
console .log (checkMaximumChildren (data, 10))