2015-09-07 10 views
9

Jestem nowy w RxJS. Wiem, że mogłem po prostu .filter i .map obserwować, aby uzyskać zmianę, której szukam. Ale czy istnieje jakaś metoda, która łączy te dwie funkcje w jedną?Czy istnieje metoda RX, która łączy mapę i filtr?

+2

Z perspektywy czasu nie ma prawie żadnego powodu, aby spróbować użyć filtru i mapy jako jednej operacji. Jeśli ktokolwiek jest "nowy w RxJS" i widzi moje pytanie, nie bierz żadnej z tych odpowiedzi. Po prostu filtruj, a następnie mapuj. –

Odpowiedz

22

Tak, istnieje.

FlatMap.

Załóżmy, że masz obserwowalne liczby (1, 2, 3, 4, 5, ...) i chcesz filtrować liczby parzyste i zamapować je na x * 10.

var tenTimesEvenNumbers = numbers.flatMap(function (x) { 
    if (x % 2 === 0) { 
    return Rx.Observable.just(x * 10); 
    } else { 
    return Rx.Observable.empty(); 
    } 
}); 
+0

Dziękuję za odpowiedź - nigdy bym nie uznał, że możesz to zrobić z dokumentów na płaskiej mapie. Wybieram odpowiedź @paulpdaniels, ponieważ jest bardziej funkcjonalna. –

+0

Masz na myśli bardziej funkcjonalny w jakim sensie? –

+1

Mam na myśli to, że w tym przykładzie operacja filtrowania musi zostać wykonana w parens instrukcji "if". Powiedzmy, że masz wspólną funkcję filtrującą, którą chcesz zastosować do tej operacji wiele razy, wciąż możesz to zrobić, ale pozostało ci pisanie wielu instrukcji if(). Dodatkowo musisz go wywoływać za każdym razem. Znacznie czystsze jest rozwiązanie, w którym można przekazać funkcje filtrowania i mapowania jako oddzielne argumenty. Moim zdaniem, rozwiązanie, które umożliwia ten styl kodowania jest bardziej "funkcjonalny". –

5

Nie, nie ma.

Ale dodanie jednego jest banalne.

Rx.Observable.prototype.filterMap = function (filterFn, selectorFn, context) { 

return this.filter(filterFn, context) 
     .map(selectorFn, context); 
} 
+0

Dzięki. Miałem nadzieję, że nie dodam czegoś takiego, ale może to być oszczędność czasu w przyszłości. –

Powiązane problemy