我有以下可观察数组:
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 => ?);
获得过滤阶段的正确方法是什么?
如果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)
您需要从角色$ 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),
);
})
);
这是使用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);
所以最后我解决了我的问题。我是通过使用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);
});