У меня есть массив javascript, где каждый элемент имеет ссылку на родителя, и они могут быть закольцованы (круговая ссылка). Пример:Как остановить эту рекурсивную функцию?
[
{"id": 1, "firstName": "Macko","parentId": 12},
{"id": 2, "firstName": "Jess","parentId": 1},
{"id": 3, "firstName": "Peter","parentId": 1},
{"id": 4, "firstName": "Lisa", "parentId": 1},
{"id": 5, "firstName": "Megan","parentId": 1},
{"id": 6, "firstName": "John", "parentId": 4},
{"id": 7, "firstName": "Joe", "parentId": 4},
{"id": 8, "firstName": "Matthew","parentId": 2},
{"id": 9, "firstName": "Peter","parentId": 2},
{"id": 10, "firstName": "Dio","parentId": 5},
{"id": 11, "firstName": "Hello","parentId": 5},
{"id": 12, "firstName": "Ana", "parentId": 4}
]
мне нужно создать вложенную структуру данных на основе выбранной записи, чтобы отобразить его в DOM, который я достигнутой рекурсивной функции, как показано ниже (источник here)
function getNestedChildren(arr, parent) {
var out = []
for(var i in arr) {
if(arr[i].parent == parent) {
var children = getNestedChildren(arr, arr[i].id)
if(children.length) {
arr[i].children = children
}
out.push(arr[i])
}
}
return out
}
Это работает очень хорошо , но не для круговых структур данных. Дело в том, что мне нужно прекратить выполнение функции до того, как она дойдет до элемента, с которого она началась.
Как я могу это достичь?
Добавить аргумент (например, массив), который хранит список посещенных идентификаторов, чтобы вы могли проверить его и, при необходимости, остановиться. – Cyb3rFly3r
@ Cyb3rFly3r Я пробовал это, но получал странные или неполные результаты. Не могли бы вы привести пример? Я поддерживаю условие в неправильном месте. – Ketus
Непонятно, каков ваш предполагаемый результат, поскольку исходный код всегда создает пустой массив. – HeadCode