如何从另一个观察者观察到一个观察者?

时间:2018-04-19 15:04:13

标签: angular rxjs

我有一个可观察的

  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));

所示

我想要一个包含所有用户使用的不同角色列表的单个数组。

非常感谢你的帮助!

2 个答案:

答案 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)])
  )
}