Мне нужно отфильтровать рекурсивный массив объектов.Каждый объект представляет маршрут / URL веб-приложения.Этот URL-адрес может быть ограничен определенной ролью (access = true | false) или нет, и каждый URL-адрес может иметь дочерние URL-адреса ... рекурсивно.
РЕДАКТИРОВАТЬ: Сложная часть заключается в том, чтофильтрация требует асинхронного вызова функции (у меня есть эта конкретная потребность в моем проекте).Вот почему я пытался сделать это с помощью RXJS, но я мог бы сделать это с помощью стандартных функций массива + async / await ...
Я также воспользовался этой возможностью, чтобы изучить еще несколько rxjs, поэтому я хочу rxjs-ориентированный ответ (и это касается асинхронности, это хороший способ, ху?).Спасибо
Имея этот массив:
[
{
id: 'level 1.1',
permission: true,
children: [
{
id: 'level 2.1',
permission: false,
children: [
{id: 'level 3.1'}
]
},
{
id: 'level 2.2',
permission: true,
children: [
{id: 'level 3.2'}
]
}
]
},
{
id: 'level 1.2'
},
{
id: 'level 1.3',
permission: false
}
]
Мне нужно отфильтровать его, чтобы получить такой вывод (оставляйте только записи, где разрешение отсутствует или верно:
[
{
id: 'level 1.1',
permission: true,
children: [
{
id: 'level 2.2',
permission: true,
children: [
{id: 'level 3.2'}
]
}
]
},
{
id: 'level 1.2'
}
]
То, что я пробовал, работает без рекурсии (закомментированный код), поэтому первый уровень успешно фильтруется, но я не знаю, как добавить рекурсию:
// simplified ASYNC filter function
promiseMe(x) {
return Promise.resolve().then(() => {
return x.permission === undefined || x.permission === true
});
}
// recursive function
const recursive = arr => {
return from(arr).pipe(
mergeMap(entry => from(this.promiseMe(entry)).pipe(
tap(y => console.log(y)),
filter(Boolean),
mapTo(entry),
tap(console.log),
mergeMap(item => {
// here I'm lost
// I need to affect the result of my async recursive function to item.children :
/*return recursive(item.children).pipe(
tap(res => {
console.log('RES', item, res)
item.children = res;
})
);*/
return of(item);
})
)),
toArray()
)
};
// main call
recursive(arr).subscribe(x => console.log('finally', x, JSON.stringify(x)))
FIDDLE здесь: https://stackblitz.com/edit/angular6-rxjs6-playground-idysbh?file=app/hello.component.ts