在Angular组件中,我有一个BehaviourSubject<IController>
类型的属性:
controllerData$ = new BehaviourSubject<IController | null>(null);
IController {
users: IUser[];
showDetails: boolean;
}
我需要迭代类型为IUser
的用户数组,并在将结果作为数组返回之前对属性数据执行中间转换。
在我使用的代码下面:
在我的代码下面:
controllerData$
.pipe(
filter((input) => input !== null),
flatMap((p) => {
return p.users;
}),
map((m: IUser) => {
const data = {m,
date: this.getWeekDay(m.occurrence),
nextOccurrence: this.service.getNextDate(m.frequency, m.occurrence),
};
return data;
}),
scan((acc: any, cur) => [...acc, cur], [])
)
当组件第一次加载两个IUser项目时,一切都运行良好。但是当我向数组中添加一个新用户时,scan方法还会复制以前的数组值,即有两个初始项并添加一个新项,我在数组中得到5个项目(前两个是两个,另一个是新项目)而不只是三个元素。
作为一种解决方法,我使用下面的解决方案实现了它,但我想知道是否可以跳过foreach
循环并使用Rxjs运算符获取所有内容:
.pipe(
filter((input) => input !== null),
map((m) => {
const results: any[] = [];
m.users.forEach((ctlr: IUser) => {
results.push({
user: ctlr.user,
date: this.getWeekDay(ctlr.occurrence),
nextOccurrence: this.service.getNextDateOccurrence(ctlr.frequency, ctlr.occurrence),
});
});
return results;
}),