Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using rxjs operator is it possible to get second last value

This is the sample code using rxjs operator, I want to print/get the second last value.

typescript

import { from } from 'rxjs';
import { map, last } from 'rxjs/operators';

//emit (1,2,3,4,5)
const source = from([1, 2, 3, 4, 5]);
//add 10 to each value
const example = source.pipe(map(val => val + 10)).pipe(last());
//output: 11,12,13,14,15
const subscribe = example.subscribe(val => console.log(val));

Currently it prints 15 but I want it to print 14 instead.

like image 208
karansys Avatar asked Jan 13 '20 17:01

karansys


Video Answer


2 Answers

You can make use of the takeLast() and skipLast RxJS operator.

The takeLast() operator allows you to

Emits only the last count values emitted by the source Observable.

while the skipLast() operator

Skip the last count values emitted by the source Observable.

Now, we can combine both pipeable operators such that we will take the last 2 counts, and skip the last count.

import { range, from } from 'rxjs';
import { takeLast, map, skipLast} from 'rxjs/operators';

const source = from([1, 2, 3, 4, 5]);

const example = source
  .pipe(
    map(val => val + 10),
    takeLast(2), 
    skipLast(1)
  );

example.subscribe(res => console.log(res));

Here is a demo.

like image 117
wentjun Avatar answered Sep 28 '22 07:09

wentjun


You can use the pairwise operator: https://www.learnrxjs.io/operators/combination/pairwise.html

import { from } from 'rxjs';
import { map,last } from 'rxjs/operators';

//emit (1,2,3,4,5)
const source = from([1, 2, 3, 4, 5]);
//add 10 to each value
const example = source.pipe(map(val => val + 10)).pipe(pairwise(),last());
//output: 11,12,13,14,15
const subscribe = example.subscribe(val => console.log(val[0]));
like image 22
Athanasios Kataras Avatar answered Sep 28 '22 08:09

Athanasios Kataras