Melhorando condicionais no JavaScript

July 18, 2020

Quando estamos escrevendo código, seja em JavaScript ou em outra linguagem, é muito comum nos depararmos com cenários onde precisamos criar condicionais desse modo:

const getFood = (type) => {
  if (type === 'fruit') {
    return ['apple', 'banana', 'mango', 'orange']
  }

  if (type === 'vegetable') {
    return ['broccoli', 'carrot', 'potato', 'pumpkin']
  }

  if (type === 'dessert') {
    return ['cookie', 'donuts', 'cupcake', 'brownie']
  }
}

getFood('dessert') // ['cookie', 'donuts', 'cupcake', 'brownie'],

Uma outra forma de fazer essas condicionais, seria utilizando a declaração switch.

const getFood = (type) => {
  switch (type) {
    case 'fruit':
      return ['apple', 'banana', 'mango', 'orange']
    case 'vegetable':
      return ['broccoli', 'carrot', 'potato', 'pumpkin']
    case 'dessert':
      return ['cookie', 'donuts', 'cupcake', 'brownie']
  }
}

getFood('dessert') // ['cookie', 'donuts', 'cupcake', 'brownie']

A situação já melhora um pouco com o switch, pois você acaba escrevendo menos código e fica mais fácil de ler. Porém, particularmente, ainda não acho a melhor solução.

Com Object Literal o cenário poderia mudar. Podemos utilizar objetos para guardar blocos de código que serão acessados de maneira condicional, de acordo com uma determinada chave.

Object Literal

No JavaScript, Object Literal é um bloco de código capaz de encapsular dados no formato chave/valor. Se você programa em JavaScript, provavelmente já utilizou objetos muitas vezes, é algo batante comum.

const user = {
  name: 'Matheus Plessmann',
  website: 'matheusplessmann.com',
}

No JavaScript, existem duas formas de se acessar valores de propriedades de um objeto. A primeira é através da notação object.key e a segunda forma é acessando através de colchetes object['key'].

const user = {
  name: 'Matheus Plessmann',
  website: 'matheusplessmann.com',
}

user.name // "Matheus Plessmann"
user['name'] // "Matheus Plessmann"

Da primeira forma, é necessário sabermos o nome da propriedade que queremos acessar, no caso 'name'. Da segunda forma, não precisamos saber qual o nome da chave que vamos acessar, podemos apenas passar uma variável para acessar uma propriedade do objeto, que aquele trexo de código não precisa saber qual.

const property = 'name'

const user = {
  name: 'Matheus Plessmann',
  website: 'matheusplessmann.com',
}

user[property] // "Matheus Plessmann"

Utilizando Object Literal para criar melhores condicionais

Dessa forma, podemos utilizar essa maneira de acessar objetos, para criar uma estrutura chave / valor, onde as chaves são os tipos de comida que precisamos acessar e os valores são os arrays das comidas. E acessar esse array com o tipo da comida que está em uma variável, utilizando a notação object[key].

const food = {
  fruit: ['apple', 'banana', 'mango', 'orange'],
  vegetable: ['broccoli', 'carrot', 'potato', 'pumpkin'],
  dessert: ['cookie', 'donuts', 'cupcake', 'brownie'],
}

const getFood = (type) => food[type]

getFood('dessert') // ['cookie', 'donuts', 'cupcake', 'brownie']

Com isso o nosso código fica bem mais reduzido, legível e simples de entender.

E se você precisar adicionar mais uma coleção de comidas, basta adicionar ao objeto e pronto. Não será preciso declarar um IF para cada condição! 😄 🎉