Задачу лучше разбить на два этапа:
1) препроцессинг - построение карты
2) фильтр уже по готовой карте
это на случай, если массив один, а фильтроваться будет многократно - тогда карту можно переиспользовать
function createMap(arr) {
const map = new Map();
arr.forEach(a => {
let childs = map.get(a.parentId);
if (!childs) {
map.set(a.parentId, childs = []);
}
childs.push(a);
});
return map;
}
function filter(map, initial) {
const result = (map.get(initial) || []).slice();
for (let i = 0; i < result.length; ++i) {
result.push(...(map.get(result[i].id) || []));
}
return result;
}
// использование
const initial = 1
const arr = [
{ name: '1', parentId: 1, id: 2 },
{ name: '2', parentId: 2, id: 3 },
{ name: '3', parentId: 1, id: 4 },
{ name: '3', parentId: 4, id: 5 }
];
var map = createMap(arr);
console.log(filter(map, initial));
console.log(filter(map, 2));