rxjs5 - 通过每个对象包含的可观察对象过滤对象数组
rxjs5 - filtering array of objects by observable that each object contains
我有一个看起来像这样的数组
[
{
name: 'foo'
filter: Observable.of(true)
},
{
name: 'bar'
filter: Observable.of(false)
}
]
并且我只想 return 那些 filter
解析为 true 的项目,我将如何以最有效和最反应的方式做到这一点?我正在使用 rxjs5 beta2。
请注意,为了简单起见,它是一个伪代码,在我的真实情况下,过滤器实际上是一个对象,它被传递给一个验证函数,return 是一个在 true
中解析的可观察对象或false
.
RxJS 4 中有两个东西可以让这变得简单:map 和 Rx.helpers.defaultComparer。第一个 map 分别发送 iterable 中的每个项目,defaultComparer 将为您进行深度检查。
var comparer = Rx.helpers.defaultComparer;
const Observable = Rx.Observable;
const arr = [
{
name: 'foo',
filter: Observable.of(true)
},
{
name: 'bar',
filter: Observable.of(false)
}
];
const data$ = Observable.from(arr)
.map(each => each)
.filter(each => comparer(each.filter, Observable.of(true)))
.subscribe(x => console.log(x));
// prints Object {name: "foo", filter: FromArrayObservable} to my console
由于某种原因,这个 defaultComparer 此时不在五个中。也许 helper 有一个新名称,因为据说它在 4 中没有被弃用,或者它可能还没有被迁移或者不在 .helpers 中。
您可以将数组中的每个项目平面映射到一个 Observable 流,该流将发出一个版本的项目,该版本将 Observable<bool>
类型的 filter
属性 替换为 bool
属性.
const data$ = Rx.Observable.from(arr)
// Convert each item's filter property to type bool
.flatMap(x => x.filter.map(condition => Object.assign({}, x, { filter: condition })))
// Now we can just filter over the filter property, which is of type bool.
.filter(x => x.filter)
// Each item emitted will have a filter value of true
.subscribe(x => console.log(x));
我有一个看起来像这样的数组
[
{
name: 'foo'
filter: Observable.of(true)
},
{
name: 'bar'
filter: Observable.of(false)
}
]
并且我只想 return 那些 filter
解析为 true 的项目,我将如何以最有效和最反应的方式做到这一点?我正在使用 rxjs5 beta2。
请注意,为了简单起见,它是一个伪代码,在我的真实情况下,过滤器实际上是一个对象,它被传递给一个验证函数,return 是一个在 true
中解析的可观察对象或false
.
RxJS 4 中有两个东西可以让这变得简单:map 和 Rx.helpers.defaultComparer。第一个 map 分别发送 iterable 中的每个项目,defaultComparer 将为您进行深度检查。
var comparer = Rx.helpers.defaultComparer;
const Observable = Rx.Observable;
const arr = [
{
name: 'foo',
filter: Observable.of(true)
},
{
name: 'bar',
filter: Observable.of(false)
}
];
const data$ = Observable.from(arr)
.map(each => each)
.filter(each => comparer(each.filter, Observable.of(true)))
.subscribe(x => console.log(x));
// prints Object {name: "foo", filter: FromArrayObservable} to my console
由于某种原因,这个 defaultComparer 此时不在五个中。也许 helper 有一个新名称,因为据说它在 4 中没有被弃用,或者它可能还没有被迁移或者不在 .helpers 中。
您可以将数组中的每个项目平面映射到一个 Observable 流,该流将发出一个版本的项目,该版本将 Observable<bool>
类型的 filter
属性 替换为 bool
属性.
const data$ = Rx.Observable.from(arr)
// Convert each item's filter property to type bool
.flatMap(x => x.filter.map(condition => Object.assign({}, x, { filter: condition })))
// Now we can just filter over the filter property, which is of type bool.
.filter(x => x.filter)
// Each item emitted will have a filter value of true
.subscribe(x => console.log(x));