我有一个可观察的
public get users(): Observable<User[]> {
return this.userData.asObservable();
}
我想从这个
创建另一个observable public get usedRoles(): Observable<Roles[]> {
// create the observable to get all the roles from all users
}
每个User
都有一个属性roles: Array<Role>
我尝试了flatMap
,但却陷入了获得正确结构的困境。
public get usedRoles(): Observable<Role[]> {
return this.users.flatMap(users => users.map(u => u.roles));
}
但这只是为每个用户分别提供了一系列角色,如this.usedRoles.subscribe(roles => console.log(roles));
我想要一个包含所有用户使用的不同角色列表的单个数组。
非常感谢你的帮助!
答案 0 :(得分:1)
试试这个
public get usedRoles(): Observable<Role[]> {
return this.users.flatMap((users) => {
const roles = [];
users.forEach((user) => {
// roles = roles.concat(user.roles);
user.roles.forEach(r => {
if (!roles.some(role => role.id === r.id)) {
roles.push(r);
}
});
});
return Observable.of(roles);
});
}
答案 1 :(得分:0)
如果要将值映射到另一个值,则可以使用常规map
运算符。
flatMap
应该是您的投影函数返回的结果是另一个可观察的结果。
import { map } from 'rxjs/operators';
import { Observable } from 'rxjs/Observable';
getUserRoles(): Observable<Role[]> {
return this.users.pipe(
map(users => users.reduce((roles, user) => [...roles, ...user.roles], [])),
map(arr => [...new Set(arr)])
)
}