如何基于两个现有的Observable数组创建一个新的Observable数组,

时间:2019-06-03 11:12:16

标签: angular rxjs

我有两个从不同API端点填充的Observable数组。我想做的是根据ID比较它们,因此仅取相等的位置,然后从数组中的每个对象中挑选属性以产生一个新的Observable数组。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这应该做:

forkJoin(
  obs1$,
  obs2$,
).pipe(
  map((obs1, obs2) => 
    obs1
      .filter(v1 => obs2.some(v2 => v1.id === v2.id))
      .map((v, i, a) => ({ ...v, ...(obs2[i] || {})}))
  ),
);
  • 结合两个可观察物
  • 要映射的管道
  • 根据第二个数组的相同ID过滤第一个数组
  • 将第一个数组的项映射为要由第二个数组的项扩展(如果已定义)
  • 返回通过管道创建的值。

概念证明:

const d1 = [
  { id: 1, value: 'v1.1' },
  { id: 2, value: 'v1.2' },
  { id: 3, value: 'v1.3' },
  { id: 4, value: 'v1.4' },
];

const d2 = [
  { id: 1, value: 'v1.1 overriden' },
  { id: 2, value2: 'v1.2 extended' },
];

console.log(d1
  .filter(v1 => d2.some(v2 => v1.id === v2.id))
  .map((v, i, a) => ({ ...v, ...(d2[i] || {})}))
);

答案 1 :(得分:0)

forkJoin(
      this.MeasuringPoints$,
      this.LatestReadings$,
    ).subscribe( data => {
          .filter(v1 =>  data[1].some(v2 => v1.uuid === v2.mpUuid))
          .map((v, i) => ({ ...v, ...(data[1][i] || {})}));
    });