Skip to content

Instantly share code, notes, and snippets.

@juliobetta
Last active April 9, 2018 02:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save juliobetta/c5ffcce44f6bcbac449e825e5b2e6c4d to your computer and use it in GitHub Desktop.
Save juliobetta/c5ffcce44f6bcbac449e825e5b2e6c4d to your computer and use it in GitHub Desktop.
Find first duplicate in a string using RxJS
const str = `Mussum Ipsum, cacilds vidis litro abertis. Si u mundo tá muito paradis?
Toma um mé que o mundo vai girarzis! Viva Forevis aptent taciti sociosqu ad litora torquent.
Aenean aliquam molestie leo, vitae iaculis nisl.
Leite de capivaris, leite de mula manquis sem cabeça.
Posuere libero varius. Nullam a nisl ut ante blandit hendrerit. Aenean sit amet nisi.
Delegadis gente finis, bibendum egestas augue arcu ut est. Admodum accumsan disputationi eu sit.
Vide electram sadipscing et per. Sapien in monti palavris qui num significa nadis i pareci latim.
Interagi no mé, cursus quis, vehicula ac nisi. Manduma pindureta quium dia nois paga.
Mais vale um bebadis conhecidis, que um alcoolatra anonimis. Si num tem leite então bota uma pinga aí cumpadi!`;
const splitted = str.replace(/(\n|\t|\s{2,})/gi, ' ').split(' ');
const source$ = Rx.Observable.from(splitted);
source$
/* 1. */ .scan((acc, item) => acc.push(item) && acc, [])
/* 2. */ .takeWhile((data, item) => (new Set(data)).size === data.length)
/* 3. */ .last()
/* 4. */ .subscribe(x => console.log(x[x.length-1]));
// OUTPUT: mundo
/*
1. accumulate each item into an array
2. transform the current accumulated value into a set, which by default remove all duplicated items,
and then compare its size to the actual data length. If they are different, it means that the first duplicated
item has been found.
3. take the last accumulated array ...
4. ... in which the last element is our first duplicate item, and print to the console.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment