angular - Observable 查找嵌套属性

标签 angular rxjs observable

Observable 返回这个对象

[
  {
    "args": { },
    "output": [
      {
        "id": "1",
        "name": "Jack",
        "lastName": "Sparrow",
      },
      {
        "id": "2",
        "name": "Davy ",
        "lastName": "Jones",
      }
    ],
  }
]

有没有办法使用RxJx 运算符返回output 数组中id===2 的元素?所以只得到这个:

{
  "id": "2",
  "name": "Davy ",
  "lastName": "Jones",
}

我想我应该使用 find,尽管找不到嵌套对象的用法示例。

我当前的代码(我知道 find 部分不正确):

  public getUserData(id: number) {
    this.http.get<any>(URL)
      .pipe(
         find(element => element.output)
      )
      .subscribe(res => {
       console.log(res)
     })
  }

最佳答案

只需结合使用 mergeMap(在其他 Rx 实现中通常称为 flatMap)和 filter!

mergeMap 允许您:

  1. 将您的每个项目映射列表(即,为每个事件发出一个值列表)
  2. 扁平化列表一起回到一个事件流

...然后你过滤为了只保留匹配你选择的谓词的那些(在你的情况下:output => output.id === 2)。


您可以尝试使用下面的代码片段,您可以在其中自行编辑收到的响应并单击相应的按钮来触发事件。

const data = [{
  "args": {},
  "output": [{
      "id": "1",
      "name": "Jack",
      "lastName": "Sparrow",
    },
    {
      "id": "2",
      "name": "Davy ",
      "lastName": "Jones",
    }
  ],
}];

const textarea = document.querySelector('#data-source');
const button = document.querySelector('#trigger-response');

// Assume `myObservable comes from the result of an Ajax request`
const myObservable = rxjs
  .fromEvent(button, 'click')
  .pipe(rxjs.operators.map(() => JSON.parse(textarea.value.replace(/,(?=\s*\})/mg, ''))));

myObservable.pipe(
  rxjs.operators.mergeMap(response => response[0].output),
  rxjs.operators.filter(output => output.id === '2')
).subscribe(x => console.log(x));
body {
  display: flex;
  align-items: center;
}

textarea {
  flex-grow: 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.0/rxjs.umd.min.js"></script>
<textarea id="data-source" rows="20">[
  {
    "args": { },
    "output": [
      {
        "id": "1",
        "name": "Jack",
        "lastName": "Sparrow",
      },
      {
        "id": "2",
        "name": "Davy ",
        "lastName": "Jones",
      }
    ],
  }
]</textarea>
<button id="trigger-response">Click Me</button>

关于angular - Observable 查找嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537078/

相关文章:

angular - 有条件地加载样式表 Angular 2

angular - 更改 Angular Material datePicker 图标

angular - Material snackbar 可观察到的内容是否完整?

javascript - Firestore : Array of references within a document into an object with array of objects (AngularFire)

arrays - 如何在 RxSwift 中使可变字典变得可观察

android - 订户 OnComplete 调用了两次

javascript - Angular:委托(delegate)模式。在 ngFor 内部优化处理程序的方法

javascript - 如何使用 rxjs 返回结果列表

rxjs - 在 takeUntil 之后做一些 Action

python - 有没有办法将回调与列表的更改相关联?