Jest to dość proste, więc jeśli możesz znaleźć duplikat, prześlij go (ponieważ nie mogę).

Mam więc obiekt, który otrzymuję z bazy danych i chcę ustawić jedną z wartości równą prostej zmiennej w kodzie zamiast odnosić się do całości (zwróć uwagę, że user.info jest w rzeczywistości obiektem zagnieżdżonym wewnątrz tablica).

let bar = user.info.foo.bar;

Powiedzmy, że bar (foo.bar) jest niezdefiniowany, ale w schemacie jest ustawiony na typ String. Chcę przypisać bar (foo.bar) do łańcucha o nazwie „foo”, więc logicznie (moim zdaniem) ustawiam bar na „foo”;

bar = "foo";

Kiedy to robię i loguję zarówno pasek, jak i rzeczywistą wartość (user.info.foo.bar), otrzymuję:

console.log(bar); // "foo"
console.log(user.info.foo.bar) // undefined

Dlaczego tak się dzieje, że pasek jest definiowany, a user.info.foo.bar nie, mimo że oba są sobie równe?

Nie ma problemu z user.info (jest zdefiniowany).

0
Bradyo 1 kwiecień 2020, 06:24

3 odpowiedzi

Najlepsza odpowiedź

Znalazłem obejście

Naprawdę chciałem przypisać user.info.foo.bar wartość „foo” bez bezpośredniego przypisywania jej tej wartości. Mogę obejść ten problem, ustawiając „bar” jako funkcję i przekazując do niego wartość oraz ustawiając user.info.foo.bar na wartość;

const bar = (value)=>{
  user.info.foo.bar = value;
  return value
}

Jeśli zrobię to w ten sposób, mogę wywołać bar z dowolną wartością, a user.info.foo.bar będzie równa tej wartości bez bezpośredniego ustawiania jej równej tej wartości (co naprawdę chciałem).

Wynik:

console.log(bar("foo")); // "foo"
console.log(user.info.foo.bar); // "foo"
0
Bradyo 1 kwiecień 2020, 04:58

Kiedy przypisujesz

let bar = user.info.foo.bar;

Wartość bar jest aktualizowana aktualną wartością user.info.foo.bar. . Kiedy zmieniasz wartość bar, ma to odzwierciedlenie, ponieważ nie dodaliśmy niczego, aby zmodyfikować wartość user.info.foo.bar.

Co możesz zrobić, to ustawić

user.info.foo.bar="foo";
let bar = user.info.foo.bar;
0
Jeevan thomas koshy 1 kwiecień 2020, 04:46

Aby uniknąć mutacji oryginalnego obiektu z bazy danych, zacznij od jego sklonowania. Rozwiązanie jest następujące:

let userInfo = {...user.info}
let bar = 'foo'
userInfo.foo.bar = bar

N / B: „bar” to nowy adres pamięci i dlatego ponowne przypisanie nie ma wpływu na obiekt „user.info” z bazy danych.

0
elonaire 1 kwiecień 2020, 05:19