将 属性 应用于多个数组中的每个元素,然后返回一个包含一个数组的平面图

Applying a property to each element in several arrays, then returning a flat map with one array

我有一个 collection 看起来像这样

[
  {
    count: 123,
    description: 'some description',
    articles: [
     {...}
    ]
  },
  {
    count: 234,
    description: 'some description',
    articles: [
      {...}
    ]
  }
]

collection 中的每个 object 都有 collection 篇文章。 我需要的 是将 description 应用到主 collection 的每个元素中相应 collection 中的每篇文章 object。我还想得到一个只包含文章的平面数组。显然我使用 mergeMap 不正确,但我不知道该怎么做。

我试过了

json$.pipe(
    // Filter out empty arrays
    filter(section => section.count > 0),
    // Apply the descriptions 
    map(section => section.articles.map(a => (Object.assign(a, section.sectionName)))),
    mergeMap(x => x.articles)
).subscribe(x => console.log(x));

但是文章里面没有description属性,不是文章的扁平化排列。我尝试了一些方法,但不确定如何继续

您只需要 concatMap 外部可观察对象,调整每篇文章后。

const { Observable } = Rx;
const { map, concatMap, filter } = Rx.operators;

const json$ = Observable.from([
  {
    count: 123,
    description: 'some description 123',
    articles: [
      {id: 1},
      {id: 2},
    ]
  },
  {
    count: 234,
    description: 'some description 234',
    articles: [
      {id: 3},
      {id: 4},
    ]
  }
]);

const withDescription$ = json$.pipe(
  filter(({count}) => count > 0),
  concatMap(
    ({articles, description}) => Observable.from(articles).map(a => ({...a, description}))
  )
);

withDescription$.subscribe(console.log);
<script src="https://unpkg.com/@reactivex/rxjs@^5/dist/global/Rx.min.js"></script>


如果您不需要内部可观察对象的任何特殊行为,您可以简化为:

const withDescription$ = json$.pipe(
  filter(({count}) => count > 0),
  concatMap(
    ({articles, description}) => articles.map(a => ({...a, description}))
  ),
);