Destrukturyzacja pojawiła się wraz z ES6 i mimo, że możemy z niej korzystać od kilku lat, postanowiłem napisać artykuł, pokazując kilka możliwości destrukturyzacji. W skrócie, destrukturyzacja pozwala nam na przypisanie wartości tablic lub obiektów do zmiennych w łatwy sposób. Standardowo w artykule posłużę się praktycznymi przykładami, dzięki czemu będzie można łatwiej przyswoić wiedzę i zobaczyć jak to działa.
Przypisanie wartości do zmiennej
Zacznijmy od bardzo prostego przykładu, czyli „wyodrębnienia” wartości dla właściwości obiektu i przypisanie wartości do zmiennych.
const www = { name: 'Magicweb.pl', address: 'https://www.magicweb.pl' }; const { name, address } = www; console.log(name); // Magicweb.pl console.log(address); // https://www.magicweb.pl
Zapis ten jest równoznaczny z:
const name = www.name; const address = www.address;
Destrukturyzację możemy również zastosować do tablic:
const www = ["Magicweb.pl", "https://www.magicweb.pl"]; let [name, address] = www; console.log(name); // Magicweb.pl console.log(address); // https://www.magicweb.pl
Co się stanie, jeżeli spróbujemy wykonać destrukturyzację, kiedy wartość nie występuje w obiekcie/tablicy?
const www = ["one"]; let [one, two] = www; console.log(one); // one console.log(two); // undefined
const www = { one: '1' }; let { one, two } = www; console.log(one); // 1 console.log(two); // undefined
Zarówno w przypadku obiektów, jak i tablicy, dla nieistniejącej właściwości otrzymamy undefined
.
Przypisanie wartości – zagnieżdżona struktura
W poprzednich przykładach mieliśmy do czynienia z płaską strukturą. Destrukturyzacji możemy użyć również dla zagnieżdżonych obiektów i tablic.
const person_list = { admin: { name: 'Lukasz' } }; let { admin: { name } } = person_list; console.log(name); // Lukasz console.log(admin); // ReferenceError: admin is not defined
W przypadku zagnieżdżonych tablic, wygląda to trochę bardziej skomplikowanie, szczególnie, jeżeli chcemy celowo pominąć dany element. W tym przypadku używamy przecinka ,
, aby pominąć dany element.
const person_list = [ ['Lukasz'], ["one", "two"], ["three"], ["value 4"] ]; let [[lukasz], [,two],,[four]] = person_list; console.log(lukasz); // Lukasz console.log(two); // two console.log(four); //value 4
Przypisanie wartości – wartości domyślne
W pierwszym przykładzie pokazałem sytuację, kiedy nie ma dostępnej właściwości, wówczas otrzymujemy undefined
. Dzięki destrukturyzacji możemy przypisać wartość domyślną.
const person = { name: 'Lukasz', age: 100 }; const { name, age, website = 'https://www.magicweb.pl' } = person; console.log(name); // Lukasz console.log(age); // 100 console.log(website); // https://www.magicweb.pl
Jak widać, w naszym przykładzie dla obiektu person
, nie mamy właściwości website
, natomiast na etapie destrukturyzacji przypisaliśmy wartość domyślną.
To samo możemy zastosować do tablic:
const person = ["Lukasz", "100"]; const [name, age, website = 'https://www.magicweb.pl'] = person; console.log(name); // Lukasz console.log(age); // 100 console.log(website); // https://www.magicweb.pl
Przypisanie wartości – zmiana nazwy
Przeglądając poprzednie przykłady, podczas destrukturyzacji odwołujemy się do nazwy właściwości obiektu i tworzymy zmienną o takiej samej nazwie, czyli dla obiektu z property "name"
, tworzymy zmienną (w naszych przypadkach stałą, ponieważ używamy const) "name"
.
Możemy zmienić nazwę na inną:
const person = { name: 'Lukasz', age: 100 }; const { name: imie, age: wiek, website : strona = 'https://www.magicweb.pl' } = person; console.log(imie); // Lukasz console.log(wiek); // 100 console.log(strona); // https://www.magicweb.pl
Przypisanie wartości – dynamiczna nazwa właściwości
Może zdarzyć się sytuacja, że będziemy potrzebować dokonać destrukturyzacji, ale nazwa właściwości obiektu może się zmieniać, a my chcemy się do niej odwołać.
const person = { name: 'Lukasz', age: 100 }; const dynamic = 'age'; const { name, [dynamic]: age } = person; console.log(name); // Lukasz console.log(age); // 100
React – destrukturyzacja props
Destrukturyzację można bardzo dobrze wykorzystać w przypadku pobieraniu wartości propsów.
function App() { return (<Person name={'Lukasz'} age={100}/>); } function Person(props) { return (<div>{props.name}, age: {props.age}</div>); }
Zamiast props
i odwoływaniu się do wartości przez props.name
oraz props.age
, możemy w parametrze funkcji dokonać destrukturyzacji.
function Person({name, age}) { return (<div>{name}, age: {age}</div>); }
W tym przypadku też możemy przypisać wartość domyślną, korzystając z wiedzy z przykładów powyżej.
function App() { return (<Person name={'Lukasz'}/>); } function Person({name, age = 999}) { return (<div>{name}, age: {age}</div>); }
Zamiana wartości w zmiennych
Ten akapit traktowałbym raczej jako bonus i pewnego rodzaju trick. Z mojego punktu widzenia takie zamiany wartości w kodzie to nic dobrego, jeżeli chodzi o logikę biznesową i może warto byłoby rozważyć zamianę kodu, aby takich sytuacji uniknąć. Ale może komuś się przyda… 🙂
let name = 100; let age = 'Lukasz'; let temporary_value; temporary_value = name; name = age; age = temporary_value; console.log(name); // Lukasz console.log(age); // 100
Bardziej „elegancko” możemy napisać ten fragment używając destrukturyzacji.
let name = 100; let age = 'Lukasz'; [ name, age ] = [ age, name]; console.log(name); // Lukasz console.log(age); // 100
Źródła:
Obraz: https://pixabay.com/pl/users/ramdlon-710044