我目前正在研究一个从我的前任继承而来的项目,在该项目中,我们从外部来源获取数据并希望对其进行可视化处理。 我继承的代码提供了两个可观察对象,每个可观察对象都有一个值数组(长度相等)。我想压缩这些可观察对象,因此得到一个可观察对象,而不是像以前一样使用(value :: value2)。
我尝试了rxjs中的zip函数,但是这只是将两个可观察对象保持不变而变成了另一个可观察对象,并且我尝试将可观察对象的内容映射到新的可观察对象上,但是显然不能映射可观察对象。 这可能很明显,但是对于整个rxjs来说,我还是一个新手。
答案 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;
}));