Привет всем, я новичок в RxJs и реактивном программировании. Я хотел бы фильтровать такой массив:
let subscription = Rx.Observable.from([{id: 1}, {id: 2}, {id: 3}],[{id: 4}, {id: 5}, {id: 6}]);
если у меня есть один массив, то ai может это сделать:
let subscription = Rx.Observable.from([{id: 1}, {id: 2}, {id: 3}]);
subscription.filter(x => x.id === 1).subscribe(x => console.log(x));
Но как я могу сделать со вторым массивом?
Если вы знаете, что у вас всегда будет массив массивов, вы можете сгладить массив и затем запустить filter
:
const o = Rx.Observable.of([{id: 1}, {id: 2}, {id: 3}],[{id: 1}, {id: 2}, {id: 3}])
.concatMap(array => array) // flatten the array into single emissions
.filter(x => x.id === 1)
.subscribe(x => console.log(x));
Я использую .of
который принимает несколько аргументов. Однако он принимает их, поскольку они не похожи на метод from
который выполняет итерацию массива.
Есть несколько решений. Легкий способ - просто создать правильное наблюдаемое.
Вы можете напрямую создать видимое справа, объединив массив в своем входе из:
let subscription = Rx.Observable.from([{id: 1}, {id: 3}].concat([{id: 1}]));
Вы можете использовать Rx.Observable.of, который непосредственно принимает столько аргументов, сколько значение в созданном Observable и использует оператор спреда:
let subscription = Rx.Observable.of(...[{id: 1}, {id: 3}].concat(...[{id: 1}]));
Вы также можете объединить два разных наблюдаемых объекта:
let subscription = Rx.Observable.from([{id: 1}
.merge(Rx.Observable.from([{ id: 1}]);
Возможно, есть и другие решения, которые могут работать как с массивом массива, а затем с плоской матрицей.