Есть такая структура данных:
const data = [
{
id: 0,
children: [
{ id: '0_1' },
{ id: '0_2' }
]
},
{
id: 1,
children: [
{
id: '1_1',
children: [
{ id: '1_1_1' },
{ id: '1_1_2' }
]
},
{ id: '1_2' }
]
}
]
Моя задача собрать все
id
, которые находятся внутри
children
, в том порядке в котором они идут в этом дереве.
Вложенность может быть любая, как и значение у id (строка или число).
В целом у меня это получилось, но мне не совсем нравится мой код, как его можно улучшить?
function getChildrenIds(arr) {
return arr.reduce((acc, child) => {
if (!child.children) {
acc.push(child)
}
else if (!child.children.some(child => child.children)) {
acc.push(child.children)
} else {
const deepChildren = getChildrenIds(child.children);
return [...acc, ...deepChildren]
}
return acc.flat();
// Пытался вернуть все id такой записью:
// return acc.flat(Infinity).map(({ id }) => id);
}, [])
}
const ids = getChildrenIds(data, 'children').map(({ id }) => id)
console.log(ids) // ["0_1", "0_2", "1_1_1", "1_1_2", "1_2"]
К примеру, мне не нравится
- куча условий (но без них не представляю как это написать)
- не могу сразу вернуть массив всех id внутри функции (вместо этого отдельно вынужден использовать
map
)