Просто используйте комбинацию mergeMap
(часто называемую flatMap
в других Rx реализациях) и filter
!
mergeMap
позволяет вам:
- map каждый из ваших элементов в списках (то есть, выводить список значений для каждого события)
- flatten списки вместе возвращаются в один поток событий
... который вы затем filter
, чтобы сохранить только те, которые соответствуют предикату по вашему выбору (в вашемcase: 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>