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

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...

Desenvolvendo um mapa usando ReactJS, MongoDB e um pouquinho de Redux - Parte 1 #BoraCodar

Sou um entusiasta desse negócio de transformar minhas ideias em código e ainda mais, quando isso me traz alguns bônus como: Aprender algo novo; contribuir com a comunidade; ou qualquer outra coisa que envolva sair da rotina. Sem mais delongas, dias atrás após conversar com alguns amigos do laboratório de computação da UEL (Universidade Estadual de Londrina), percebi que muita gente sai do ensino médio sem uma noção de quais cursos interessantes existem perto de onde mora, ou pior, aonde ela poderia encontrar aquele curso que mais se encaixa em seu perfil. Eu mesmo, antes de ir pra computação fiz 2 vestibulares na área de humanas (História e Ciências Sociais - ambas na Unesp) e um em computação (Fema - Assis, SP). Contudo,  quando saiu a nota do Enem vi que havia uma universidade próximo da minha cidade que era federal que que aceitava o programa Sisu. Foi assim que ingressei na UTFPR de Cornélio Procópio. Essa odisseia toda, me fez refletir que seria interessante usar meu tem...