根据其他数组向Observable数组添加其他属性

时间:2019-02-05 02:01:56

标签: angular rxjs angular2-observables

我有两个Observable<MyType>的可观察数组类型

export interface MyType{
  title: string;
  id: string;
  other: [];
}

我想向第一个数组添加其他属性exists,如果第二个数组中存在该项,则将其设置为true

  const combined$ = combineLatest(this.first$, this.second$);
    this.output$ = combined.pipe(
      map((x, y) => {
        return x.map(a => {
          a.title = a.title;
          a.id = a.id;
          a.other = a.other;
          a.exists = y.find(b => b.id === a.id )
        });
      })
    );

如果订阅[...undefined]可观察的output,则始终获得this.output$.subscribe(console.log);的结果

有什么办法解决吗?

3 个答案:

答案 0 :(得分:2)

我认为Combine发送一个值,该值是单个值的数组。在这里y是不确定的。

使用([x,y])分解map中的值,然后重试。 组合的$也有一个错字,您错过了。 并且find可以替换为some,以更好地表示逻辑并返回布尔值

此外,当您使用x.map时,还会在逻辑上映射错误的数组。

const combined$ = combineLatest(this.first$, this.second$);
this.output$ = combined$.pipe(
  map(([x, y]) => {
    return x.map(a => {
      a.title = a.title;
      a.id = a.id;
      a.other = a.other;
      a.exists = y.some(b => b.id === a.id )
    });
  })
);

答案 1 :(得分:2)

在您的代码段中,您有一个错字,您可以将CombinedLatest rxjs运算符的结果设置为combined$,然后在下一行将其称为combined,我认为这是不正确的,或者仅仅是将此问题转换为SO时发生翻译错误。 (无论如何,必须指出,呵呵)

接下来,combineLatest运算符将返回所有可观察值的数组。这样,您可以在map运算符中使用解构轻松地从所有可观察对象中获取最新值。

下面是最终代码:

const combined$ = combineLatest(this.first$, this.second$);
this.output$ = combined.pipe(
  map(([x, y]) => {
    return x.map(a => {
      a.title = a.title;
      a.id = a.id;
      a.other = a.other;
      a.exists = y.find(b => b.id === a.id )
    });
  })
);

在原始代码中,您实际上是将值的数组传递为x

答案 2 :(得分:2)

请注意,find返回在数组中找到的元素(否则为 undefined )。更好地使用some。另外,当您在地图上返回对象时,应使用常规的return语句或括号中的对象。

const combined$ = combineLatest(this.first$, this.second$);
this.output$ = combined.pipe(
    map(([x, y]) => {
        return x.map(a => {
            return { 
                ...a,
                exists: y.some(b => b.id === a.id)
            };
         });
     })
);