Pular para o conteúdo principal

Como serializar todos os dados de um formulário em um objeto JSON usando jQuery? #fastTip

Um dos pilares de um código bem escrito é: DRY (Dont Repeat Yourself - não se repita). Acontece que muitas vezes nos deparamos com situações que por conta da necessidade de entrega expressa (famoso código miojo - feito em 2 minutos), acabamos deixando de aplicar boas práticas. O que difere um amador de um profissional é a sua capacidade de avaliar o impacto que um código mal escrito causa e identificar os caminhos pra resolver esses impasses. Enfim, vamos ao que interessa:

O Problema

Desejo criar um objeto JSON à partir de um formulário, para ser enviado em uma requisição assíncrona. Atualmente, o objeto é criado assim:

var data = {
 name: $('input[name="name"]').val(),
 email: $('input[name="email"]').val(),
};

Olhando pra esse código, vemos diversos problemas: Se mudar o name do input, precisará ir lá no código para alterar a atribuição. Se houver um formulário com 20 campos, terá que fazer 20 atribuições, e assim por diante.

A Solução

Crio um objeto FormTool que servirá como utilitário para ser reaproveitado em toda a aplicação. Dentro desse objeto teremos 2 funções: convertFormDataSerializedArrayIntoObject, que como o próprio nome indica, converte dados de um formulário serializados em um array em um objeto; e transformArrayOfObjectsIntoOneObject, que transformará um array de objetos em um único objeto (isso será usado pela função convertFormDataSerializedArrayIntoObject). Veja:

const FormTool = {
    convertFormDataSerializedArrayIntoObject: function(serializedData) {
        var valuesIntoArrayOfObjects = serializedData.map(function(data) {
            var valueIntoString =
                "{" +
                JSON.stringify(data.name) +
                ": " +
                JSON.stringify(data.value) +
                "}";
            return JSON.parse(valueIntoString);
        });
        return FormTool.transformArrayOfObjectsIntoOneObject(
            valuesIntoArrayOfObjects
        );
    },
    transformArrayOfObjectsIntoOneObject: function(objects) {
        var oneObject = objects.reduce(function(objectReduced, item) {
            return Object.assign(objectReduced, {
                [Object.keys(item)[0]]: Object.values(item)[0]
            });
        }, {});
        return oneObject;
    }
};

Em seguida, o que precisamos fazer é usar esse utilitário da seguinte maneira:

$('#form').on('submit', function(event){
      var form = $(this);
      var serializedValues = form.serializeArray();
      var data = FormTool.convertFormDataSerializedArrayIntoObject(
          serializedValues
      );

      // ...
});

Observe que agora, independente da quantidade de campos um formulário tenha, você precisará de apenas 2 linhas para obter um objeto JSON. Até a próxima ;)

Comentários

Postagens mais visitadas deste blog

Prefira exceções à códigos de erros #FastTip #CleanCode

Gostaria de compartilhar com vocês uma técnica que aprendi a me acostumar ao longo dos anos, mas que conheci pelo livro do Robert C. Martin, o Clean Code . De forma bem sintetizada, o autor relata que uma boa prática é retornar exceções, ao invés de códigos de erro, pois isso evita a escrita de códigos de verificação, e mantém ele enxuto, mais confiável, sem aberturas para bugs relacionados à erros não previstos. Esse conteúdo você encontrará no capítulo 3 (página 46 - 47) e no capítulo 7 (página 103 - 112), do livro supracitado. Aí como exemplo, desenvolvi um pequeno código Javascript que pode servir de referência para os demais, por ser simples de entender. // ----------------------------- // Criei uma classe genérica que permite acesso ao objeto // Error, padrão do JS, e escrevo a stack trace nomeada // à partir de um Error genérico class GenericError extends Error { constructor(message) { super(message); this.name = this.constructor.name; Error.captureStackTrace(t

Executar uma tarefa em background no Android usando React Native

Pegue um café e se ajeite na cadeira, pois vou contar uma história um pouco longa a respeito de como executar serviços em segundo plano com React-Native e imagino que vai servir mais como um norte na hora de desenvolver esse tipo de funcionalidade. Primeiro, pesquisei na documentação oficial do React, e lá é indicado um recurso chamado Headless JS, que permite criar uma ponte entre o JS e o código nativo, e executar tarefas em background. Em seguida, fiz uma pesquisa sobre como funcionam as tarefas em segundo plano no Android para entender quais são as possibilidades e prós e contras de cada abordagem. Sobre as abordagens, temos: # WorkManager A API WorkManager facilita a programação de tarefas adiáveis e assíncronas que precisam ser executadas mesmo se o app fechar ou o dispositivo reiniciar. Principais recursos: Compatível com versões anteriores até a API 14 Usa o JobScheduler em dispositivos com a API 23 ou posteriores Usa uma combinação de BroadcastReceiver + AlarmManage