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:
Desejo criar um objeto JSON à partir de um formulário, para ser enviado em uma requisição assíncrona. Atualmente, o objeto é criado assim:
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:
Em seguida, o que precisamos fazer é usar esse utilitário da seguinte maneira:
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 ;)
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
Postar um comentário