Poznajemy naprawdę ciekawy wzorzec rekurencyjny, który przyjmuje tablicę i funkcję callback zwracając prawdę lub fałsz. Oto on.

Na początku zobaczmy jak działa funkcja some:

[2, 5, 8, 1, 4].some((x) => x > 10); // false
[12, 5, 8, 1, 4].some((x) => x > 10); // true

Nazwa jest mega nieintuicyjna. Powinna nazywać się (moim zdaniem) any. Cóż, nieważne.

Chodzi o to, że funkcja wywołuje callback na każdym elemencie tablicy aż znajdzie element prawdziwy dla danego callbacku i zwróci prawdę, lub wyczerpie ilość elementów i zwróci fałsz.

Ok, napiszmy sobie funkcję some:

function someRecursive(array, callback) {

    if (array.length === 0) return false;

    if (callback(array[0])) return true;

    return someRecursive(array.slice(1),callback);
}

Ten wzorzec jest częsty. Przyjmowana jest tablica, patrzymy czy ma jakąś długość. Wywołujemy coś (tutaj callback) na pierwszym jej elemencie. Wywołujemy funkcję rekurencyjnie przekazując jej tablicę ale z pierwszym elementem uciętym.

I tak w kółko aż do wyczerpania elementów lub zwrócenia jakiejś wartości. Dodam, że someRecursive to nie jest polyfill. To jeszcze sobie napiszemy.

Chodzi mi o podejście do pracy z tablicami, o stworzenie interfejsu do obsługi ich a następnie uszczuplanie ich o już sprawdzone elementy. Kolejny przykład to funkcja palindrom:

function isPalindrome(str){

    if(str.length === 1) return true;

    if(str.length === 2) return str[0] === str[1];

    if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1))

    return false;
}

Jak długość 1 (np. j w kajak, po którymś wywołaniu rekurencyjnym) to prawdę zwróć. Jak długość 2 to porównaj, czy są sobie równe. Jeżeli dłuższe (np. wyraz kajak) to porównaj k z k i sprawdź aja (odcięte już porównane elementy).

W innym przypadku zwracamy false, bo np. mamy „kajag”, k !== g…

Dotychczas bawiliśmy się tablicami w rekurencji poprzez closures i funkcja wewnętrzna dopisywała robiąc rekurencyne traversy pasujące wyniki do tablicy z domknięcia, którą zwracała funkcja wyższego rzędu.

Tutaj mamy chyba coś, czego nie omawiałem jeszcze, czyli rekurencyjną pracę z tablicami. Slice przydaje się.