Давайте сначала изменим этот строковый массив
export interface AllUsers{
allUsers: User[]; // shouldn't be a string array?!
}
Добавьте пользователя
export interface User {
id: number;
firstName: string;
lastName: string;
email: string;
password: string;
roles: Role[];
}
И роль
export interface Role {
id: number;
name: string
}
Попытайтесь избежать использования подписки, используйте асинхронный каналвместо.Вы можете использовать lodash для обработки ваших массивов.
export class AllUserComponent implements OnInit {
allUsers$: Observable<User[]>;
distinctRoles$: Observable<Role[]>;
constructor(private userService: UserService) {}
ngOnInit() {
// Take from UserService getAll method
this.allUsers$ = this.userService.getAll().pipe(
map((all: AllUsers) => all.allUsers),
);
// map the roles
this.distinctRoles$ = this.allUsers$.pipe(
map((allUsers: User[]) => _.flatMap(allUsers, 'roles')), // import * as _ from 'lodash'
map((allRoles: Role[][]) => _.flatten(allRoles)),
map((allRoles: Role[]) => _.uniq(allRoles)), // remove the line if you don't want disctinct
);
}
И "подписаться" на ваши Observables в вашем шаблоне с помощью асинхронного канала
<div *ngFor="let role of disctictRoles$ | async">