Desestruturação de objetos javascript e filtro de propriedades

Desestruturação de objetos javascript e filtro de propriedades

O ECMAScript 6 (também conhecido como ES6 ou ECMAScript 2015) trouxe pra gente várias features que ajudam na legibilidade, organização do código e praticidade. Neste artigo vamos falar da desestruturação de objetos, muito utilizada atualmente em códigos Node.js, mas também podendo ser aplicada no javascript do browser (para navegadores que suportam o ES6 ou superior).

Desestruturação de Objetos

A desestruturação de objetos em javascript nada mais é do que uma maneira prática para desmembrar um objeto javascript, que muitas vezes vem de um JSON (JavaScript Object Notation).

Assumindo o seguinte objeto javascript para a constante teste:

const teste = {
  nome: 'Yuri',
  sobrenome: 'Magagnatto',
  site: 'webtutorial.com.br'
}

Se quisermos jogar as propriedades nome, sobrenome e site para 3 constantes de maneira rápida e sucinta, podemos usar a desestruturação da seguinte forma:

const { nome, sobrenome, site } = teste;

console.log(nome) // 'Yuri'
console.log(sobrenome) // 'Magagnatto'
console.log(site) // 'webtutorial.com.br'

Caso queiramos que as nossas novas constantes tenham outros nomes podemos fazer a desestruturação dessa outra forma:

const { nome: outroNome, sobrenome: outroSobrenome, site: outroSite } = teste;

console.log(outroNome) // 'Yuri'
console.log(outroSobrenome) // 'Magagnatto'
console.log(outroSite) // 'webtutorial.com.br'

Não é necessário pegar todos as propriedades do objeto teste, podemos pegar apenas as que nos convêm:

const { nome, site } = teste;

console.log(nome) // 'Yuri'
console.log(site) // 'webtutorial.com.br'

Deste modo pegaríamos apenas os as propriedades nome e site.

Como desestruturar um objeto para outro objeto filtrando as propriedades?

Muitas vezes no desenvolvimento de uma API Node.js, nós pegamos o JSON enviado pelo cliente através do req.body e salvamos esses dados direto no banco, como no exemplo a seguir:

async store(req, res) {
  await User.create(req.body);
}

Assumindo que o JSON enviado pela requisição do cliente seja:

{
  nome: 'Yuri',
  sobrenome: 'Magagnatto',
  site: 'webtutorial.com.br',
  senha: '123456'
}

Nesse caso, se o modelo do banco tivesse essas 4 propriedades, as 4 seriam salvas no banco de dados. Mas vamos supor que não quiséssemos salvar a senha, e ela foi inserida na requisição por um usuário mal-intencionado.

Para validar, poderíamos desmembrar todas as propriedades e especificar somente as que queremos na hora de salvar no banco. Isso traria repetição dos nomes das nossas propriedades, como no exemplo a seguir:

async store(req, res) {

  const { nome, sobrenome, site } = req.body;

  await User.create({ nome, sobrenome, site });

}

Para solucionar esse problema de uma maneira sucinta basta desestruturar o objeto utilizando uma filtragem nas propriedades:

async store(req, res) {

  const propriedadesAceitas = [
    'nome',
    'sobrenome',
    'site'
  ];

  const novoObjeto = Object.fromEntries(
    Object.entries(req.body).filter(([key]) => propriedadesAceitas.includes(key))
  );

  await User.create(novoObjeto);

}

O código acima faz uma filtragem nos dados, comparando os nomes informados no array com os nomes das propriedades do req.body. Apenas os nomes que coincidirem vão ser passados para a constante novoObjeto, garantindo a segurança dos dados que serão salvos no banco e um código enxuto!

Referências