如何过滤可观察数组?

问题描述 投票:-1回答:4

我有以下可观察数组:

const stages = [
{Id: 1, Name: "First stage", RoleId: 71},
{Id: 2, Name: "Second stage", RoleId: 72},
{Id: 3, Name: "Third stage", RoleId: 73}];

const roles = [
{Id: 71, Name: "Stuff", Key: "STF"},
{Id: 72, Name: "Manager", Key: "MGR"},
{Id: 73, Name: "CEO", Key: "CEO"}];

所以我有"MGR"键,我希望能够观察stages,其中RoleId等于经理的角色。

它们是两个可观察的部分:阶段和角色。我已经阅读了有关combineLatest方法,这可能对我有帮助,但我不知道如何过滤组合结果。

const filteredStages = stages.combineLatest(roles, (s, r) => ({
    s: s,
    r: r
}))
.filter(x => ?);

获得过滤阶段的正确方法是什么?

javascript rxjs
4个回答
0
投票

如果role.Id不会改变:

stages.filter(stage => stage.RoleId === 72)

如果role.Id可能会在以后更改:

const manager = roles.find(role => role.Key === "MGR");

stages.filter(stage => stage.RoleId === manager.Id)

0
投票

您需要从角色$ stream获取数组中的所有ID,然后将switchmap连接到具有匹配ID的所有阶段的阶段$ stream:

return roles$.pipe(
  switchMap(roles => {
    let ids = roles.filter(role => role.Key === 'MGR').map(role => role.Id);

    return stage$.pipe(
      filter(stage => ids.indexOf(stage.Id) > -1),
    );
  })
);

0
投票

这是使用Rxjs版本5语法

我认为创建另一个您想要过滤的角色的可观察对象是明智的。下面我通过Key属性过滤来做到这一点。

const stages$ = Observable.of([
   {Id: 1, Name: "First stage", RoleId: 71},
   {Id: 2, Name: "Second stage", RoleId: 72},
   {Id: 3, Name: "Third stage", RoleId: 73}]);

const roles$ = Observable.of([
   {Id: 71, Name: "Stuff", Key: "STF"},
   {Id: 72, Name: "Manager", Key: "MGR"},
   {Id: 73, Name: "CEO", Key: "CEO"}];

const selectedRole$ = roles$.filter((roles) => {
    return roles.filter(r => r.Key === "MGR");
});

const filteredStages$ = Observable.combineLatest(
  stages$,
  selectedRole$,
  (stagesArr, role) => {
     return stagesArr.filter(s => s.Id === role.Id)
  })
  .subscribe((filteredStages) => console.log('stages', filteredStages);

-2
投票

所以最后我解决了我的问题。我是通过使用map函数完成的。

const key = 'MGR';

const filteredStages = stages.combineLatest(roles,
(s, r) => ({
   s,
   r
})).map(x => {
    const managerRole = x.r.find(role => role.LookupKey === key);

    return x.s.filter(stage => stage.RoleId !== managerRole.Id);
});
© www.soinside.com 2019 - 2024. All rights reserved.