Wpis z mikrobloga

https://jsfiddle.net/5n319twL/

Mam dwie funkcje bardzo do siebie podobne: nest i append.

nest ma za zadanie zagnieżdżać obiekty jeden wewnątrz kolejnego według podanej tablicy.
append ma za zadanie dołączać kolejne wartości z tablicy do tekstu.

Obie funkcje są rekurencyjne.
Obie funkcje zmieniają zmienną na której pracują.

Pytanie:
Dlaczego na koniec obie funkcje zwracają inną wartość z funkcji niż jest w zmiennej? - Patrz logi.
Dlaczego w funkcji nest to obiekt "a" na koniec zwraca prawidłową wartość,
natomiast zupełnie odwrotnie funkcja append - to funkcja zwraca prawidłową wartość a nie zmienna "text"?

#javascript
  • 3
@scorpio18k: jeżeli chodzi o funkcję nest:

obj[props[0]] = {};
return nest(obj[props[0]], props.slice(1));

wywołujesz funkcję nest z {} jako pierwszy parametr

if (props.length === 0) {
return obj;
}
tutaj zwracasz ten parametr (czyli {}) dlatego finalnie funkcja zwraca {}
@scorpio18k:

Dlaczego w funkcji nest to obiekt "a" na koniec zwraca prawidłową wartość


Bo na sam koniec robisz return obj, który jest ostatnim (pustym) kluczem z tablicy (czyli z). Czyli pierwszy log pokazuje tylko klucz z, a w drugim wołasz już o cały obiekt.

natomiast zupełnie odwrotnie funkcja append - to funkcja zwraca prawidłową wartość a nie zmienna "text"?


Bo w stringach nie działa referencja. W żadnym miejscu
@scorpio18k: Rozwiązaniem dla nest będzie dodanie trzeciego parametru (który będzie przekazywał referencję do oryginalnej zmiennej).

function nest(obj, props, orgObj) {
if (props.length === 0) return orgObj;
else return nest(obj[props[0]] = {}, props.slice(1), orgObj || obj);
}

Dzięki zastosowaniu orgObj || obj nie musisz podawać tego argumentu przy wywołaniu funkcji (referencja będzie przechodzić automatycznie).

Rozwiązaniem dla append będzie przypisywanie wartości przy wywołaniu funkcji.

console.log(text = append(text, ['b', 'c', 'x', 'y', 'z']));