Executando verificação de segurança...
1

Usando funções com array de objetos

Atenção! Este artigo foi traduzido do inglês para o português a partir da fonte informada ao final do artigo, escrita pelo autor Cihan. A tradução é fornecida apenas para fins informativos e não deve ser considerada como uma tradução oficial. Não me responsabilizo por quaisquer erros ou imprecisões que possam ter sido introduzidos na tradução. É altamente recomendável que você verifique a precisão do conteúdo com a fonte original em inglês.

Prefácio

Quantas operações diferentes podemos fazer usando apenas um único array de objetos? Essas soluções, que parecem simples, mas contêm muitas dicas, irão aprimorar suas habilidades.

const students = [
  {
    name: 'John',
    isOnline: false,
  },
  {
    name: 'Jane',
    isOnline: true,
  },
  {
    name: 'Pedro',
    isOnline: false,
  },
]

1. Como classificar objetos em JavaScript usando o método Sort

Às vezes, precisamos classificar os objetos em uma matriz de acordo com a propriedade do objeto. Como você costuma fazer?

students.sort((first, second) => {
  if (first.isOnline && !second.isOnline) {
    return -1
  } 
  else if (!first.isOnline && second.isOnline) {
    return 1
  } 
  else {
    return 0
  }
})

console.log(students)

2. Como classificar um array de strings em JavaScript

Agora vamos colocar os nomes dos alunos em um array. Se houver um array de strings, qual é a maneira mais confiável de classificá-las?

const studentNames = students.map((user) => user.name)

studentNames.sort((first, second) => {
  return first.localeCompare(second)
})

console.log(studentNames)

O método localeCompare() verifica se uma determinada string vem antes, depois ou é equivalente a outra string na ordem de classificação.

3. Usar um IIFE em JavaScript pode ajudar a resolver problemas de escopo

Às vezes, podemos ter que trabalhar com a palavra-chave var. Por exemplo, se quisermos imprimir os nomes dos alunos após um segundo, obteremos o seguinte erro.

for (var i = 0; i < studentNames.length; i++) {

  setTimeout(() => {
    console.log(studentNames[i]) 
  }, 1000)

}

Output: // undefined undefined undefined

Como var é um escopo global, os valores de i aumentam primeiro. O valor pós-loop de i é 3. Então, quando o método setTimeout no loop de eventos é chamado, o studentNames[3] se torna indefinido. Porque o nome do último aluno é armazenado no 2º índice.

O IIFE pode ser usado para criar um novo escopo de função para setTimeout. Só precisamos envolver o setTimeout em um IIFE.

for (var i = 0; i < studentNames.length; i++) {

  ((studentName) => {
    setTimeout(() => {
      console.log(studentName)
    }, 1000)
  })(studentNames[i])

}

Output: // Jane John Pedro

Ou com a palavra-chave let do ES6: Como a palavra-chave let tem escopo de bloco, os valores i são armazenados em cada loop e podemos ver os valores consecutivos.

for (let i = 0; i < studentNames.length; i++) {
  setTimeout(() => {
    console.log(studentNames[i])
  }, 1000)
}

Output: // Jane John Pedro

4. Como usar Object.entries para converter objetos em arrays

Como podemos colocar objetos em um array dos próprios pares [key, value]? Qual é a maneira mais fácil de fazer isso? Podemos fazer isso facilmente usando os métodos map e Object.entries juntos.

Às vezes, realmente precisamos fazer isso.

const entriesStudents = students.map((student) => Object.entries(student))

console.log(entriesStudents)

Saída:

[
    [
        [
            "name",
            "Jane"
        ],
        [
            "isOnline",
            true
        ]
    ],
    [
        [
            "name",
            "John"
        ],
        [
            "isOnline",
            false
        ]
    ],
    [
        [
            "name",
            "Pedro"
        ],
        [
            "isOnline",
            false
        ]
    ]
]

5. Como usar Object.fromEntries para converter arrays em objetos

O que devemos fazer se quisermos restaurar a situação acima novamente? Podemos restaurá-lo usando os métodos map e Object.fromEntries juntos.

const fromEntriesStudents = entriesStudents.map((student) => {
  return Object.fromEntries(student)
})

console.log(fromEntriesStudents)

Saída:

[
    {
        "name": "Jane",
        "isOnline": true
    },
    {
        "name": "John",
        "isOnline": false
    },
    {
        "name": "Pedro",
        "isOnline": false
    }
]

Se você quiser tentar, clique aqui