如何压缩2个可观察对象,以便获得一个包含两行的可观察对象?

时间:2019-07-07 18:08:34

标签: angular zip observable

我目前正在研究一个从我的前任继承而来的项目,在该项目中,我们从外部来源获取数据并希望对其进行可视化处理。 我继承的代码提供了两个可观察对象,每个可观察对象都有一个值数组(长度相等)。我想压缩这些可观察对象,因此得到一个可观察对象,而不是像以前一样使用(value :: value2)。

我尝试了rxjs中的zip函数,但是这只是将两个可观察对象保持不变而变成了另一个可观察对象,并且我尝试将可观察对象的内容映射到新的可观察对象上,但是显然不能映射可观察对象。 这可能很明显,但是对于整个rxjs来说,我还是一个新手。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您将获得两个可观察值,每个可观察值恰好触发一次。两者都产生一个数组。您想将这两个数组配对,并将它们转换为元组列表(或哈希表)。诚然,这有点猜测。

重新阅读https://scotch.io/tutorials/rxjs-operators-for-dummies-forkjoin-zip-combinelatest-withlatestfrom后,我怀疑zip运算符是您的朋友。它产生一个数组元组。将其转换为元组数组仍然是一个挑战。我有点过时,所以我会使用旧的for循环。我的解决方案的伪代码草图如下所示:

const a$: Observable<Array<any>> = of([1, 2, 3]);
const b$: Observable<Array<any>> = of(['A', 'B', 'C']);
const result$ = zip(a$, b$).pipe(
  map(twoArrays => {
    const a = twoArrays[0];
    const b = twoArrays[1];
    const r: Array<[any, any]> = [];
    for (let i = 0; i < a.length; i++) {
      r.push([a[i], b[i]]);
    }
    return r;
  })
);

如果需要哈希表,可以创建一个对象而不是数组:

let r = {};

并按如下所示定义键值对:

r[a[i]] = b[i];

2019年7月9日更新: 仅作记录,这是我的第一次尝试,因此您可以了解下面有关抱怨编译器错误的注释。

const a$: Observable<Array<any>> = ...;
const b$: Observable<Array<any>> = ...;
const result$ = zip(a$, b$).pipe(
  map((a: Array<any>, b: Array<any>) => {
    let r: Array<[any, any]> = [];
    for (let i = 0; i < a.length; i++) {
      r.push([a[i], b[i]]);
    }
    return r;
  }));