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ę.