All Articles

JavaScript: Atribuição via Desestruturação (Destructuring Assignment)

Atribuição por Desestruturação é uma adição do ES6 que permite extrair dados a partir de arrays ou objetos e atribuir a variáveis. Essa técnica é bastante usada ao se trabalhar com props no React.js, também podemos ver a sintaxe de desestruturação implementada em outras linguagens, inclusive o C# a partir da versão 7 possui a sua implementação, chamada de Desconstrutor como pode ser conferido aqui.

O conceito do destructuring é basicamente a divisão de uma estrutura complexa em partes mais simples. Em JavaScript pode ser utilizado em Arrays e Objetos.

Desestruturando Arrays

Ante do ES6 para fazer a atribuição de diversos valores de um array em variáveis distintas era preciso fazer diversas declarações:

var skills = ['CSS','HTML','Node'];
var css = skills[0];
var html = skills[1];
var node = skills[2];

Precisávamos de uma declaração para cada atribuição. Com a sintaxe de desestruturação podemos fazer o mesmo de uma forma mais sucinta:

const skills = ['CSS','HTML','Node'];
let [css, html, node] = skills;

Também é possível fazer a desestruturação atribuindo vários elementos do array para um outro array. Vamos acrescentar mais alguns itens ao nosso array skills:

const skills = ['CSS','HTML','Node', 'C#'];

Agora a ideia é atribuir os valores ‘Node’ e ‘C#’ para um novo array chamado backend:

let [css, html, ...backend] = skills;

Ao executar o exempo podemos ver que as variáveis css e html permaneceram com seus respectivos valores, já a variável backend recebeu os valores consecutivos. Isso foi possível ao se utilizar o operador spread(os três pontos antes da variável):

Exemplo de uso da desestruturação com operador spread

Desestruturando o retorno de uma função

É possível desestruturar um array retornado por uma função. Vamos criar uma função que irá retornar alguns horários de um suposto agendamento:

function horariosAgendamento(){
  return ['08:00', '09:00', '10:00'];
}

E para fazer a desestruturação basta declarar as variáveis recebendo o retorno da função:

let [primeiraHora, segundaHora, terceiraHora] = horariosAgendamento();

Desestruturando o retorno de uma função

Objetos

O mesmo pode ser feito com objetos, ao desestruturar um objeto pegamos suas propriedades e atribuimos a variáveis. Vamos criar um objeto pessoa:

let pessoa = {
    'nome' : 'Thiago',
    'sobrenome' : 'Reis',
    'skills' : [
        'css',
        'javascript',
        'html',
        'react',
        '.net',
    ]
};

O objeto criado é composto por três atributos, nome, sobrenome e skills. Em seguida vamos atribuir o valor de cada atributo do objeto a uma variável específica:

let { nome, sobrenome, skills } = pessoa;

Diferente da desestruturação de arrays, em objetos utilizamos chaves em vez de colchetes. Vale lembrar que o nome das variáveis deve ser o mesmo nome do atributo no objeto, caso contrário o valor das variáveis será undefined.

props no React

Em React vemos bastante a utilização da desestruturação, principalmente em componentes funcionais. Como exemplo, vamos passar o objeto pessoa criado anteriormente para um componente. Temos um componente personList, que recebe um objeto pessoa e lista os seus dados. Sem usar a desestruturação, a maneira que temos para acessar o objeto passado via props é da seguinte forma:

props.pessoa.nome

É possível simplificar o acesso aos atributos do objeto usando a desestruturação:

import React from "react";

const PersonList = ({ person: { nome, sobrenome, skills } }) => {
  return (
    <div>
      <p>
        {nome} {sobrenome}
      </p>
      <p>skills</p>
      <ul>
        {skills.map(skill => (
          <li>{skill}</li>
        ))}
      </ul>
    </div>
  );
};

export default PersonList;

O que fizemos aqui foi dizer ao componente que no objeto pessoa queremos ter acesso direto aos atributos nome, sobrenome e skills. Dessa forma é retornado variáveis com os respectivos nomes permitindo assim acesso direto a cada um.
Edit patient-cloud-38wl1