1
resposta

[Dúvida] Desafio 4 - Questão 04

Olá, pessoal. Estava quebrando a cabeça aqui pra tentar resolver a questão 4, mas na resposta só me deixou mais confuso ainda. Vamos lá!

O converter para Objeto o JSON achei estranho, pois ele já é invoca como Objeto. Tive que converter primeiro em String pra depois converter em Objeto, pois dava erro de [object Object].

Outra coisa, sobre o Modificar.

const animalParaModificar = animaisObjeto.animais.find(animal => animal.id === 2);
if (animalParaModificar) {
    animalParaModificar.habitat = "Oceano Antártico";
}

Esse é o melhor jeito mesmo de editar um dado? Não existe uma forma simplificada?

Sobre remover dados, eu pensei em usar o delete, sendo:

delete animaisObjeto.animais[2];

Porém ele retorna <1 empty item> ou null quando é lido em Stringify pelo console.log.

A resposta da questão sugeriu assim:

const indiceAnimalRemover = animaisObjeto.animais.findIndex(animal => animal.id === 1);
if (indiceAnimalRemover !== -1) {
    animaisObjeto.animais.splice(indiceAnimalRemover, 1);
}

Na mesma questão do modificar, não teria um jeito mais simples? Não entendi o uso do !== -1 e do splice ali. Poderiam me explicar?

E por fim, pede no final para reconverter para String de novo, porém vejo que usa um tal de null, 2.

const animaisNovaString = JSON.stringify(animaisObjeto, null, 2);

O que faz isso? Não entendi.

Aguardo resposta.

1 resposta

Olá, Patrick! Tudo bem?

Vamos tentar esclarecer suas dúvidas, uma por uma.

Sobre a conversão do JSON para objeto, o que acontece é que quando você importa um arquivo JSON usando require(), o Node.js já faz a conversão para objeto JavaScript automaticamente. Portanto, você não precisa usar JSON.parse() nesse caso. Se você tentar usar JSON.parse() em um objeto, você vai receber um erro, pois JSON.parse() espera uma string como argumento. Isso explica porque você teve que converter para string antes de converter para objeto.

Quanto à modificação de dados, o método que você usou é uma maneira comum de fazer isso. Você primeiro encontra o objeto que deseja modificar, e então altera a propriedade desejada. Infelizmente, não há uma maneira mais "simplificada" de fazer isso em JavaScript.

Sobre a remoção de dados, o método delete remove a propriedade de um objeto, mas não remove o elemento de um array. Isso é por que quando você tentou delete animaisObjeto.animais[2], você viu <1 empty item> no console. Isso significa que o elemento no índice 2 foi removido, mas o espaço que ele ocupava no array ainda existe. É por isso que a solução sugerida usa Array.prototype.splice(), que remove o elemento do array e move todos os elementos seguintes para preencher o espaço vazio.

O !== -1 é usado para verificar se o animal com id === 1 foi encontrado no array. O método Array.prototype.findIndex() retorna -1 se nenhum elemento satisfaz a condição fornecida. Portanto, se findIndex() retornar -1, sabemos que o animal não foi encontrado e não devemos tentar removê-lo.

Finalmente, sobre a reconversão para string, JSON.stringify() pode receber até três argumentos. O primeiro é o objeto que você deseja converter para string. O segundo argumento é uma função de substituição que você pode usar para filtrar ou transformar os valores do objeto enquanto ele está sendo convertido.

Neste caso, null é passado como o segundo argumento, o que significa que nenhuma transformação será feita. O terceiro argumento é um número que especifica a quantidade de espaços em branco usados para a indentação. Neste caso, 2 é passado como o terceiro argumento, o que significa que a string JSON resultante será formatada com 2 espaços em branco em cada nível.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.