Dane z obiektów możemy wyciągać tak jak to robiliśmy do tej pory, czyli korzystając ze składni kropki lub kwadratowych nawiasów. Możemy też skorzystać z tak zwanego przypisania destrukturyzującego, czy też destrukturyzacji, która skraca zapis.
consttab= ["Ala","Ola","Ela"];//pobieram wartości klasycznieconstname1=tab[0];constname2=tab[1];//za pomocą destrukturyzacjiconst[name1,name2]=tab;
constob={name :"Rudzik",pet :"kot"}//klasycznieconstname=ob.name;constpet=ob["pet"];//za pomocą destrukturyzacjiconst{name,pet}=ob;
Destrukturyzacja tablic
Aby stworzyć nowe zmienne na bazie danych z tablicy możemy skorzystać z zapisu:
Jeżeli chcielibyśmy z tablicy wyciągnąć wartości, ale z pominięciem kolejnej, wtedy po prostu jej nie podajemy:
Podczas tworzenia zmiennych, możemy im też ustawić domyślną wartość, która zostanie użyta, jeżeli w tablicy nie będzie wartości na danym indeksie:
Przypisanie takie możemy też zastosować przy zamianie miejscami wartości zmiennych:
Destrukturyzacja obiektów
Przypuśćmy, że mamy obiekt:
Jeżeli teraz chciałbym, z tego obiektu wyciągnąć dane i podstawić je pod zmienne mógłbym to zrobić w klasyczny sposób:
Ale i korzystając z destrukturyzacji:
Tak samo jak w przypadku tablic, zmiennym możemy ustawić domyślną wartość:
Gdybyś chciał stworzyć zmienne o nowych nazwach, musisz użyć znaku dwukropka:
Destrukturyzacja w iteracji
Destrukturyzacja idealnie sprawdza się w przypadku iterowania po danych:
Destrukturyzacja i parametry funkcji
Bardzo przydatnym manewrem jest zastosowanie destrukturyzacji w przypadku parametrów funkcji.
Wszędzie tam, gdzie ktoś (w tym silnik Javascript) przekaże ci jakiś obiekt czy tablicę, możesz używać desktruturyzacji do wyciągania danych z jego wnętrza.
Zamiast więc działać bezpośrednio na danej zmiennej:
Mogę wyciągnąć odpowiednie dane:
Podobnie będzie miało to miejsce w przypadku przekazywania wartości do funkcji:
Zamiast:
mogę:
Szczególnie ten ostatni przypadek ma bardzo duże znaczenie przy bardziej rozbudowanych aplikacjach.
W obiektach kolejność kluczy nie ma znaczenia, dzięki czemu mogę przekazywać do funkcji dane nie zważając na kolejność danych:
Zamiast pamiętania kolejności, mogę skróconym zapisem stworzyć obiekt i przekazać go do funkcji:
Co więcej mogę to połączyć z domyślnymi wartościami dla wyciąganych kluczy z obiektu, dzięki czemu odpalając funkcję nie będę musiał przekazywać wszystkich wartości:
Destrukturyzacja i rest
Stosując przypisanie destrukturyzacji możemy też użyć operatora rest, co pozwala nam wybierać resztę zmiennych:
Podobny zabieg możemy też stosować dla obiektów, co przydaje się gdy chcemy pomijać jakieś właściwości:
lub kopiować płaskie obiekty:
Podejście to będziemy stosować w kilku projektach np. tutaj lub tutaj.
Bardziej skomplikowana struktura
Jeżeli za pomocą destrukturyzacji chcemy wyciągać zagnieżdżone dane, wtedy w naszym wzorze powinniśmy odwzorować wygląd struktury obiektu:
Zauważ, że nasz wzorzec postawiłem pod myObj lub pusty obiekt. Dzięki temu zabezpieczam się na wypadek, gdyby nie było myObj w ogóle.
.fetch(.....)
.then(result => result.json())
.then(result => {
//działamy na pobranych użytkownikach
for (const el of result.users) {
const {
name = "",
surname = "",
email = "",
plan = "basic"
role = "user",
www = ""
} = el;
console.log(surname, name, email, plan, role, www);
}
});
const buttons = document.querySelectorAll("button");
//zamiast
buttons.forEach(el => {
console.log(`Tekst elementu to ${el.innerText} a jego id to ${el.id}`);
})
const buttons = document.querySelectorAll("button");
buttons.forEach(({innerText : text, id}) => {
console.log(`Tekst elementu to ${text} a jego id to ${id}`);
});
function showUser(ob) {
console.log(ob.name);
console.log(ob.surname)
}
const user = {
name : "Marcin",
surname : "Nowak"
}
showUser(user)
function showUser({name, surname}) {
console.log(name);
console.log(surname)
}
const user = {
name : "Marcin",
surname : "Nowak"
}
showUser(user);
//klasyczna funkcja z kilkoma parametrami
function print(name, speed, color, food) {
console.log(`
Name : ${name}
Speed : ${speed}
Color : ${color}
Food : ${food}
`);
}
//mam kilka zmiennych, które chcę do niej przekazać
const name = "Szamson";
const speed = 10000;
const color = "brown";
const food = "mięso";
const type = "dog";
//w przypadku zwykłych parametrów muszę pamiętać ich kolejność
//nie jest to jakimś super problemem, bo dobry edytor mi je podpowie
print(name, speed, color, food);
//do poniższej funkcji ktoś mi przekaże obiekt, a ja go od razu rozbiję na odpowiednie zmienne
function print({name, speed, color, food}) {
console.log(`
Nazwa : ${name}
Szybkość : ${speed}
Kolor : ${color}
Ulubione jedzenie : ${food}
`);
}
print({
name : "Szamson",
speed : 10000,
food : "Mięso",
color : "brown",
})
//lub jeżeli mam już wcześniej zmienne
//mogę stworzyć obiekt z takimi kluczami:
const name = "Szamson";
const speed = 10000;
const color = "brown";
const food = "mięso";
const type = "dog";
//kolejność nie ma znaczenia
print({name, food, speed, type, color}); //dodatkowy klucz type nie ma znaczenia
//bo to jest to samo co:
print({
name : name,
food : food,
speed : speed,
type : type,
color : color
});
function print({name, speed = 100, color = "red", food = "mięso", height = 140}) {
}
print({
name : "Karol",
height : 200
})
const ob = {
name : "Piotrek",
age : 20,
surname : "Nowak",
pet : "pies"
}
const {pet, ...obWithoutPet} = ob;
console.log(pet); //"pies"
console.log(obWithoutPet); //obiekt bez właściwości pet