将 属性 应用于多个数组中的每个元素,然后返回一个包含一个数组的平面图
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}))
),
);
我有一个 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}))
),
);