Как отфильтровать массив с помощью оператора RxJS

1

Привет всем, я новичок в 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));

Но как я могу сделать со вторым массивом?

  • 0
    Вы хотите испустить все объекты {id: n} из двух ваших массивов?
  • 0
    да, мне нравится искать из обоих массивов {id: n}.
Теги:
arrays
rxjs
rxjs5

2 ответа

1
Лучший ответ

Если вы знаете, что у вас всегда будет массив массивов, вы можете сгладить массив и затем запустить 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 который выполняет итерацию массива.

0

Есть несколько решений. Легкий способ - просто создать правильное наблюдаемое.

  • Вы можете напрямую создать видимое справа, объединив массив в своем входе из:

    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}]);
    

Возможно, есть и другие решения, которые могут работать как с массивом массива, а затем с плоской матрицей.

  • 0
    да, это очень мило. Но что делать в случае, когда я получаю от API и это уже множественный массив. ?
  • 0
    Это массив массивов? Если это так, flatMapping должен работать. subscription.flatMap (x => Rx.Observable.from (x))
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню