Desestruturação - JavaScript
A desestruturação permite extrair valores individuais de um objeto para variáveis ou constantes:
const user = {
name: "Tom",
age: 24,
phone: "+367438787",
email: "tom@gmail.com"
};
const {name, email} = user;
console.log(name); // Tom
console.log(email); // tom@gmail.com
Durante a desestruturação de um objeto, as variáveis são colocadas entre chaves e é atribuído um objeto a elas. A correspondência entre as propriedades do objeto e as variáveis/constantes ocorre pelo nome.
É possível atribuir a variáveis/constantes nomes diferentes dos nomes das propriedades do objeto:
const user = {
name: "Tom",
age: 24,
phone: "+367438787",
email: "tom@gmail.com"
};
const {name: userName, email: mailAddress} = user;
console.log(userName); // Tom
console.log(mailAddress); // tom@gmail.com
Nesse caso, a propriedade name
userName
email
mailAddress
Também podemos definir valores padrão para variáveis/constantes, para o caso de algumas propriedades não estarem presentes no objeto:
const user = {
name: "Tom",
age: 24,
};
const {name = "Sam", email: mailAddress = "sam@gmail.com"} = user;
console.log(name); // Tom
console.log(mailAddress); // sam@gmail.com
Se uma variável/constante na desestruturação corresponder a uma propriedade que é um objeto complexo, após a desestruturação essa variável/constante também representará um objeto complexo:
const user = {
name: "Tom",
age: 24,
account: {
login: "tom555",
password: "qwerty"
}
};
const {account} = user;
console.log(account.login); // tom555
console.log(account.password); // qwerty
Mas se quisermos obter valores individuais de um objeto complexo aninhado, como no exemplo acima com o objeto account
user
const user = {
name: "Tom",
age: 24,
account: {
login: "tom555",
password: "qwerty"
}
};
const {name, account: {login}} = user;
console.log(name); // Tom
console.log(login); // tom555
Obtenção de Propriedades Restantes com o Operador rest
O operador rest ou operador ...
const tom = {
name: "Tom",
age: 24,
phone: "+367438787",
email: "tom@gmail.com"
};
const {name, age, ...contacts} = tom;
console.log(name); // Tom
console.log(age); // 24
console.log(contacts); // {phone: "+367438787", email: "tom@gmail.com"}
Neste caso, o objeto tom
name
age
contacts
name
age
contacts
...
...contacts
contacts
email
phone
tom
É importante notar que a variável/constante que recebe todas as propriedades restantes de um objeto sempre representará um objeto, mesmo se ela receber apenas uma propriedade desse objeto.
Desestruturação de Arrays
Também é possível desestruturar arrays:
const users = ["Tom", "Sam", "Bob"];
const [a, b, c] = users;
console.log(a); // Tom
console.log(b); // Sam
console.log(c); // Bob
Na desestruturação de um array, as variáveis são colocadas em colchetes e sequencialmente recebem os valores dos elementos do array.
Se houver menos variáveis/constantes do que elementos no array, os elementos restantes do array são simplesmente ignorados:
const users = ["Tom", "Sam", "Bob"];
const [a, b] = users;
console.log(a); // Tom
console.log(b); // Sam
Se houver mais variáveis/constantes do que elementos no array, as variáveis/constantes não mapeadas recebem o valor undefined
const users = ["Tom", "Sam", "Bob"];
const [a, b, c, d] = users;
console.log(a); // Tom
console.log(b); // Sam
console.log(c); // Bob
console.log(d); // undefined
Obtenção de Elementos Restantes em Outro Array
Usando o operador ...
const users = ["Tom", "Sam", "Bob", "Mike"];
const [tom, ...others] = users;
console.log(tom); // Tom
console.log(others); // ["Sam", "Bob", "Mike"]
Aqui, o array others
Pulando Elementos
Também podemos pular uma série de elementos do array, deixando espaços em vez dos nomes das variáveis:
const users = ["Tom", "Sam", "Bob", "Ann", "Alice", "Kate"];
const [first,,,,fifth] = users;
console.log(first); // Tom
console.log(fifth); // Alice
A expressão first,,,,fifth
first
fifth
Da mesma forma, podemos obter, por exemplo, o segundo e o quarto elementos:
const users = ["Tom", "Sam", "Bob", "Ann", "Alice", "Kate"];
const [,second,,forth] = users;
console.log(second); // Sam
console.log(forth); // Ann
Desestruturação de Arrays Multidimensionais
const coordinates = [[1,2,3], [4,5,6], [7,8,9]];
const [
[x1,y1,z1],
[x2,y2,z2],
[x3,y3,z3]
] = coordinates;
console.log(x1, y1, z1); // 1 2 3
Desestruturação de Objetos de Arrays
Podemos combinar a obtenção de dados de um array e um objeto:
const people = [
{name: "Tom", age: 34},
{name: "Bob", age: 23},
{name: "Sam", age: 32}
];
const [,{name}] = people;
console.log(name); // Bob
Neste caso, obtemos o valor da propriedade name
Outro exemplo - desestruturação de objetos durante a iteração de um array de objetos:
const people = [
{name: "Tom", age: 34},
{name: "Bob", age: 23},
{name: "Sam", age: 32}
];
for(let {name: username, age: userage} of people){
console.log(`Name: ${username} Age: ${userage}`);
}
// Saída no console
// Name: Tom Age: 34
// Name: Bob Age: 23
// Name: Sam Age: 32
Desestruturação de Parâmetros
Se um array ou objeto é passado como parâmetro para uma função, ele também pode ser desestruturado em valores individuais dessa forma:
function display({name:userName, age:userAge}) {
console.log(userName, userAge);
}
function sum([a, b, c]) {
const result = a + b + c;
console.log(result);
}
const user = {name:"Alice", age:33, email: "alice@gmail.com"};
const numbers = [3, 5, 7, 8];
display(user); // Alice 33
sum(numbers); // 15
Troca de Valores
Graças à desestruturação, tornou-se muito fácil trocar valores entre duas variáveis:
let first = "Tom";
let second = "Bob";
[first, second] = [second, first];
console.log(first); // Bob
console.log(second); // Tom
Isso facilita a resolução de várias tarefas. Por exemplo, usamos a desestruturação para uma simples ordenação de array:
let nums = [9, 3, 5, 2, 1, 4, 8, 6];
for(let i = 0; i < nums.length; i++)
for(let j = 0; j < nums.length; j++)
if (nums[i] < nums[j]) [nums[j], nums[i]] = [nums[i], nums[j]];
console.log(nums); // [1, 2, 3, 4, 5, 6, 8, 9]