Głębokie kopie tablic

Dziś krótki wpis. Uzupełnienie poprzedniego posta, opisującego podstawowe różnice pomiędzy typami prostymi a referencyjnymi.

Wyjaśniłem tam dlaczego nie możemy skopiować tablicy przy użyciu operatora ‚=’. Taka operacja przypisuje do zmiennej po lewej stronie operatora referencje do której prowadzi zmienna po prawej stronie. Nie kopiuje tablicy tak jak w przypadku zmiennych typu prostego, jak ‚number’ czy ‚boolean’.

Zamiast tego otrzymamy tak zwaną „płytką kopię” (shallow copy). Wszelkie zmiany, które program wykona w użyciu nowej płytkiej kopii, będą też odzwierciedlone w oryginale. Obie zmienne tak naprawdę wskazują na ten sam obiekt.

Dzieje się tak dlatego, że wszystkie obiekty w JavaScripcie (tablica też jest obiektem) są typami referencyjnymi. Jak się nad tym zastanowimy, ma to sens, ponieważ zamiast kopiować obiekt, lepiej jest stworzyć jego nową instancję za pomoc operatora ‚new’.

Z doświadczenia wiem jednak, że czasem przydaje się zrobić ‚głęboką kopię’ istniejącej już tablicy z całą jej zawartością. Skoro nie mamy takiej możliwości, to możemy stworzyć ją sobie sami!

Najpierw tworzymy funkcję. Jako argument przyjmuje ona tablicę, którą chcemy skopiować. Muszę tu zaznaczyć, że tablica przekazywana jako argument, jest też ‚płytką kopią’. Oznacza to, że zmiany na argumencie w funkcji, będą odzwierciedlone w zmiennej zewnętrznej. Niedługo napiszę więcej na ten temat, ale póki co, wystarczy wiedzieć, że jeżeli nie chcemy aby nasza oryginalna tablica była zmieniona przez funkcję, nie zmieniajmy wartości przekazywanego argumentu.

W funkcji będzie nam potrzebna zmienna tymczasowa, przechowująca naszą ‚głęboką kopię’.

Pamiętamy o słówku ‚var’ aby nie stworzyć przypadkiem zmiennej globalnej 🙂 Następnie tworzymy pętlę FOR, która będzie iterować przez tablicę przekazaną jako argument funkcji.

Teraz wystarczy w każdym kroku pętli przypisać wartość aktualnej iteracji tablicy z argumentu do naszej zmiennej tymczasowej.

Na koniec pozostało nam tylko zwrócić nową tablicę i gotowe 🙂

A tak będzie nasza nowa funckja wyglądać w użyciu:

I gotowe! Funkcja ta pomoże nam tworzyć głębokie kopie tablic.
Miłej zabawy z kodem 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *