W tym wpisie pokażę, jak prostym kodem JS rozwiązać problem zliczenia liczby wystąpień konkretnego słowa w ciągu znaków w JavaScript (czy też TypeScript).

Zacznijmy od prostego kodu:

var input = "Oto kot, czy kto to?";
var count = (input.match(/ot/g) || []).length;
console.log(count);

Wyświetli w konsoli “1”.

Co tu się dzieje?

W linii drugiej jest przekazane wyrażenie regularne /ot/g. Oznacza to “szukaj w input wystąpień ‘ot'”. Dodanie flagi g (global) sprawia, że po znalezieniu pierwszego wystąpienia poszukiwania się nie kończą.

Dlaczego 1, nie 2?

Ktoś mógłby uznać, że przecież są 2 wystąpienia “ot” w ciągu input. Tak i nie. Przecież drugie to “Ot”, nie “ot”.

Aby móc zignorować wielkość liter należy wykorzystać dodatkową flagę i (ignore).

var count = (input.match(/ot/gi) || []).length;

Wtedy w wyniku otrzymujemy 2.

Parametryzacja

Co zrobić, aby móc przekazać wyszukiwany tekst jako zmienną do funkcji. Dodatkowo wykorzystam konstruktor RegExp.

function countOccurrences(input, word) {
    return (input.match(new RegExp(word, 'gi')) || []).length;
}

Czym jest Promise? Jest to obiekt zwracany z metody, dzięki któremu możemy w łatwy sposób obsługiwać asynchroniczne funkcje i ich rezultaty (tak te wynikające z pełnego sukcesu, jak i z błędów, które mogą się zdarzyć w trakcie wykonania).

Przykłady w tym wpisie będą w TypeScript. Aby móc je prawidłowo uruchamiać zapoznaj się z artykułem: TypeScript: Szybki start.

Jak działa Promise?

Promise (ang. obietnica) ma 2 zasadnicze stany:

  • pending – oczekiwanie
  • settled – rozstrzygnięty
    • resolved – rozwiązany (choć spotykałem też określenie “fulfilled”)
    • rejected – odrzucony

Promise’ów używa się w funkcjach asynchronicznych (np. komunikacji ajaksem z serwerem). Dopóki nie mamy odpowiedzi (promise nie jest rozstrzygnięty) uznajemy, że jest w stanie pending (ang. w oczekiwaniu).

Kiedy już mamy wynik działania funkcji może ona być albo zakończona pozytywnie albo nie.Continue reading