首页 > 解决方案 > 如何基于两个现有的 Observable 数组创建一个新的 Observable 数组,

问题描述

我有两个从不同 API 端点填充的 Observable 数组。我想要做的是根据 ID 比较它们,所以只取相等的地方,然后从数组中的每个对象中挑选属性以生成一个新的 Observable 数组。有任何想法吗?

标签: angularrxjs

解决方案


这应该这样做:

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] || {})}))
);


推荐阅读