• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Javascript - dostęp do własności obiektu

+1 głos
153 wizyt
pytanie zadane 16 marca 2021 w JavaScript przez Author[] Bywalec (2,970 p.)
zamknięte 16 marca 2021 przez Author[]

Mam pewną funkcję która przyjmuje 3 argumenty: 

  1. obiekt
  2. tablicę lub zmienną typu string
  3. dowolną wartość

Funkcja miała za zadanie zmienić wartość parametrów obiektu których nazwy znajdują się w argumencie 2

Jedyne rozwiązanie które działa wykorzystuje eval:

function bad(object, arg, new_value)
{
if (object==null || arg==null)
return false;

let command="object";

if(Array.isArray(arg))
{
arg.forEach((value)=>{
command+='['+value+']';
})
command+='='+new_value;
eval(command) /
}
else
{
object[arg]=new_value;
}
return true;
}

Czy da się zrobić coś takiego bez eval?

komentarz zamknięcia: Udało się rozwiązać problem

1 odpowiedź

+3 głosów
odpowiedź 16 marca 2021 przez Comandeer Guru (579,080 p.)
wybrane 16 marca 2021 przez Author[]
 
Najlepsza

Da się, wystarczy podstawić zmienną do nazwy własności: obj[ zmienna ] = wartosc;

komentarz 16 marca 2021 przez Author[] Bywalec (2,970 p.)

To wiem, wykorzystałem to w rozwiązaniu z eval, jednak nie mam pojęcia jak dostać się do obiektu zagnieżdżonego, którego stopnia zagnieżdżenia oraz własności wstępnie nie znam - dostają je od użytkownika. Przykład tu:

let obj={
example: "ssdas",
example1: {
     example2: "sdsadas"
},
example3: {
     example4: {
     example5: {}
}
}
}

mam tablicę w której przechowuję nazwę właściwości obiektu:

let arr=[example3, example4, example5]

Mając ją chcę się dostać do obiektu w ten sposób:

obj[arr[0]][arr[1]][arr[2]]="coś tam"

jednak nie znam długości tej tablicy dopóki jej nie dostanę

komentarz 16 marca 2021 przez Comandeer Guru (579,080 p.)

A, to najsensowniej jest to zrobić rekurencyjnie/iteracyjnie IMO. Coś typu:

  1. Niech zmienna current będzie naszym obiektem.
  2. Weź pierwszy element z tablicy z kluczami i zapisz do zmiennej key.
  3. Pobierz do zmiennej current obiekt current[ key ].
  4. Jeśli wciąż są elementy w tablicy z kluczami, przejdź do punktu 2. Jeśli tablica jest pusta, zwróć wartość current.
komentarz 16 marca 2021 przez Author[] Bywalec (2,970 p.)
Czy zadziała to do przypisania wartości?
komentarz 16 marca 2021 przez Comandeer Guru (579,080 p.)

Tak, z tym, że trzeba lekko zmodyfikować algorytm (zwrócić wartość current, gdy zostanie jeden element tablicy i wtedy zrobić przypisanie). Coś typu:

const obj = {
	a: {
		b: {
			c: {
				d: null
			}
		}
	},
	e: null
};

changeValue( obj, [ 'a', 'b', 'c', 'd' ], 'newValue' );
changeValue( obj, 'e', 'WHATEVER' );
console.log( obj );

function changeValue( obj, keys, newValue ) {
	if ( !Array.isArray( keys ) ) {
		keys = [ keys ];
	}

	let current = obj;

	while ( keys.length > 1 ) {
		current = current[ keys.shift() ];
	}

	current[ keys.shift() ] = newValue;
}

 

komentarz 16 marca 2021 przez Author[] Bywalec (2,970 p.)

Kod działa świetnie jednak mam jeszcze jedno pytanie. Próbowałem wykryć gdyby użytkownik przekazał do funkcji obiekt np taki:

let obj={}

I jako 2 parametr dał tablicę:

["example1", "example2"]

Wygeneruje to oczywiście błąd bo nie można znaleźć parametru example2 z obj["example1"]. Chciałbym jednak żeby program tworzył pusty obiekt (przykład wykorzystujący poprzednie dane wejściowe):

Wyjście:

{
    example1: {example2: "jakaś wartość"}
} 

Próbowałem to zrobić w ten sposób:

function changeValue( obj, keys, newValue ) {
    if ( !Array.isArray( keys ) ) {
        keys = [ keys ];
    }
 
    let current = obj;
 
    while ( keys.length > 1 ) {
        current = current[ keys.shift() ];
        if (current==undefined)
        {
               current={};
        }
    }
 
    current[ keys.shift() ] = newValue;
}

Niestety zamiast tworzyć obiekt w obiekcie funkcja zwraca pusty obiekt

komentarz 16 marca 2021 przez Comandeer Guru (579,080 p.)

Musiałbyś zrobić to inaczej. Raczej coś typu:

while ( keys.length > 1 ) {
		const key = keys.shift();

		if ( current[ key ] === undefined ) {
			current[ key ] = {};
		}
		
		current = current[ key ];
	}

 

komentarz 16 marca 2021 przez Author[] Bywalec (2,970 p.)
Wszystko działa, dziękuję za pomoc!

Podobne pytania

+1 głos
1 odpowiedź 113 wizyt
0 głosów
1 odpowiedź 82 wizyt
pytanie zadane 14 grudnia 2019 w JavaScript przez VGB Początkujący (370 p.)
0 głosów
0 odpowiedzi 74 wizyt
pytanie zadane 17 czerwca 2020 w JavaScript przez Uwaciusz Nowicjusz (140 p.)

89,694 zapytań

138,297 odpowiedzi

309,243 komentarzy

59,623 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...