Можно обойтись без рекурсии
const sources = [{
"id": 1,
"parent_id": 0,
"name": "Россия"
},
{
"id": 2,
"parent_id": 0,
"name": "Украина"
},
{
"id": 3,
"parent_id": 1,
"name": "Москва"
},
{
"id": 4,
"parent_id": 1,
"name": "Питер"
},
{
"id": 5,
"parent_id": 3,
"name": "Улица Пушкина"
},
]
// 1 -> [3, 5] // дети россии - это Москва и Улица пушкина
// 2 -> [] // дети украины - пусто
// 3 -> [5] // дети москвы - улица пушкина
// 4 -> [0] // дети питера - пусто
// 5 -> [0] // дети улица пушкина - пусто
const fn = (data, findId) => {
const parents = data.reduce((acc, item) => {
if (acc.has(item.parent_id)) {
return new Set([...acc, item.id]);
}
return acc;
}, new Set([findId]));
return data
.filter(item => parents.has(item.parent_id))
.map(item => item.id);
}
console.log(fn(sources, 1));