#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))