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

Имеется нижепредставленный массив. Очевидно, что groups могут добавляться и убираться в любом месте. Хочу вывести все пути, пройденные по "веткам" до каждого последнего (пустого) groups.

Делаю это так:

const data = {  
    "groups": [{
        "id": 1,
        "name": "name",
        "groups": [
            {
            "id": 2,
            "name": "name",
            "groups": [
                {
                    "id": 3,
                    "name": "name",
                    "groups": []
                },
                {
                    "id": 4,
                    "name": "name",
                    "groups": []
                }
            ]},
            {
            "id": 5,
            "name": "name",
            "groups": []
            }
        ]
    },
    {
        "id": 6,
        "name": "name",
        "groups": []
    }]
};

let rootsRoute =[], rootsKeys = [];

function rootsCollector(groupsData) {
    for (i = 0; groupsData.length > i; i++) {
        if (groupsData[i].groups.length === undefined) {
            return
        } else {

            if(!groupsData[i].groups.length) {
                rootsKeys.push(i);
                rootsRoute.push(rootsKeys);
                rootsKeys = [];
                return
            } else {
                rootsKeys.push(i);
                groupsData = groupsData[i].groups;
                rootsCollector(groupsData);
            }
        }
    }
}
groupsData = data.groups;
rootsCollector(groupsData);
console.log(rootsRoute);

Выводит, только два из четырех маршрута. Получается, что рекурсия не входит во все дочерние элементы первого элемента. Где я ошибся? Как это сделать правильно?


Ответы (1 шт):

Автор решения: Redither

Решено было так:

function rootsCollector(groupsData, rootsKeys=[]) {
    for (let i = 0; i<groupsData.length; i++) {
        if (groupsData[i].groups.length === undefined) {
            return
        } else {
            let route = [...rootsKeys, i];
            if(!groupsData[i].groups.length)
                rootsRoute.push(route);
            else 
                rootsCollector(groupsData[i].groups, route);
        }
    }
}
rootsCollector(data.groups);
console.log(rootsRoute);

→ Ссылка