Подсчитайте количество детей рекурсивно в Javascript / Typescript / ES6 - PullRequest
0 голосов
/ 31 мая 2019

Я ищу рекурсивный метод, который бы подсчитывал все элементы с детьми.

В настоящее время я просто заглядываю на три уровня и увеличиваю счетчик, когда обнаруживаю, что у предмета есть дети.

Однако я хочу иметь возможность рекурсивной проверки, пока в массиве нет дочерних элементов.

[
    {
        id: 2,
        name: 'parent',
        children: [
            {
                id: 12,
                name: 'firstChild',
                children: [
                    {
                        id: 22,
                        name: 'firstGrandChild',
                        children: [
                            {
                                id: 32,
                                name: 'GreatGrandChild',
                                children: []
                            }
                        ]
                    }
                ]
            },
            {
                id: 3,
                name: 'secondRowFirstChild',
                children: [
                    {
                        id: 13,
                        name: 'secondRowGrandChild',
                        children: []
                    }
                ]
            },
            {
                id: 4,
                name: 'thirdRowFirstChild',
                children: [
                    {
                        id: 14,
                        name: 'thirdRowGrandChild',
                        children: []
                    }
                ]
            }
        ]
    }
]


// Here is the procedural code that I want to convert

getExpandableRowCount(items: TableRow[]): number {
    let count = 0

    items.map(item => {
        if (item.children && item.children.length) {
            count++;
            item.children.map(subItem => {
                if (subItem.children && subItem.children.length) {
                    count++;
                    subItem.children.map(subSubItem => {
                        if (subSubItem.children && subSubItem.children.length) {
                            count++;
                        }
                    })
                }
            })
        }
    });

  return count;
}

Я ожидаю, что счет будет 5.

1 Ответ

0 голосов
/ 31 мая 2019

Вы можете использовать Array.reduce(), и если у элемента есть children длиной более 0, добавьте 1, вызовите count и добавьте к итогу:

const count = arr => arr.reduce((r, { children = [] }) => 
  children.length ? r + 1 + count(children) : r
, 0)

const data = [{"id":2,"name":"parent","children":[{"id":12,"name":"firstChild","children":[{"id":22,"name":"firstGrandChild","children":[{"id":32,"name":"GreatGrandChild","children":[]}]}]},{"id":3,"name":"secondRowFirstChild","children":[{"id":13,"name":"secondRowGrandChild","children":[]}]},{"id":4,"name":"thirdRowFirstChild","children":[{"id":14,"name":"thirdRowGrandChild","children":[]}]}]}]

const result = count(data)

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...