【问题标题】:Filter Observable by property of array of objects按对象数组的属性过滤 Observable
【发布时间】:2020-01-20 22:15:54
【问题描述】:

我需要过滤一个 Observable 并仅“通过”在该流内部的对象数组中具有特定属性值的流。

让我们举个例子。这是可观察的。

 const observable = of({name: 'agency', year: '2010', job: [
        {name: 'plumber', city: 'Los Angeles'},
        {name: 'driver', city: 'Dallas'}
      ]});

observable.subscribe(response => console.log(response));

只有当作业数组中有 'name:plumber' 时,我才需要在 subscribe 方法中控制台记录一个响应(响应必须是整个流)。

所以我要做的是:

observable.pipe(
 filter(obs => obs.job.filter(item => item.name === 'plumber')))
.subscribe(response => console.log(response));

observable.pipe(
 map(obs => obs.job),
 filter(item => item.name === 'plumber'))
.subscribe(response => console.log(response));

不幸的是,上面的代码没有按预期工作。

只有当作业数组中有一个键值=名称:'plumber'时,我才想接收整个流。

如果满足这个条件,我想获取console.log: {name: 'agency', year: '2010', job: Array(2)},否则控制台中不应该出现任何内容。

你能帮帮我吗?

【问题讨论】:

  • 那么预期的结果究竟应该是什么?
  • 预期结果应该是整个Observable对象:{name: 'agency', year: '2010', job: Array(2)},但前提是有name: 'plumber'条件遇到了。

标签: javascript angular rxjs


【解决方案1】:

我认为这样就可以了:

const observable = of({name: 'agency', year: '2010', job: [
        {name: 'plumber', city: 'Los Angeles'},
        {name: 'driver', city: 'Dallas'}
      ]})
        .pipe(filter(obj => obj.job.some(({ name }) => name === 'plumber')))

observable.subscribe(response => console.log(response));

对于每个发出的值,您验证jobs 属性是否包含满足相关条件的元素。这可以通过使用Array.prototype.some() 来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多