当添加新项时,Rxjs Scan方法复制Observable的数组属性的内容

时间:2018-02-25 11:51:35

标签: arrays angular observable rxjs5

在Angular组件中,我有一个BehaviourSubject<IController>类型的属性:

controllerData$ = new BehaviourSubject<IController | null>(null);

IController {
  users: IUser[];
  showDetails: boolean;
}

我需要迭代类型为IUser的用户数组,并在将结果作为数组返回之前对属性数据执行中间转换。 在我使用的代码下面:

  1. flatMap():展平IUsers []项目
  2. map():迭代用户并应用中间处理
  3. scan():将结果再次打包成数组
  4. 在我的代码下面:

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

0 个答案:

没有答案