Convert form data to JavaScript object with jQuery Convert form data to JavaScript object with jQuery javascript javascript

Convert form data to JavaScript object with jQuery


serializeArray already does exactly that. You just need to massage the data into your required format:

function objectifyForm(formArray) {    //serialize data function    var returnArray = {};    for (var i = 0; i < formArray.length; i++){        returnArray[formArray[i]['name']] = formArray[i]['value'];    }    return returnArray;}

Watch out for hidden fields which have the same name as real inputs as they will get overwritten.


Convert forms to JSON like a boss


The current source is on GitHub and Bower.

$ bower install jquery-serialize-object


The following code is now deprecated.

The following code can take work with all sorts of input names; and handle them just as you'd expect.

For example:

<!-- All of these will work! --><input name="honey[badger]" value="a"><input name="wombat[]" value="b"><input name="hello[panda][]" value="c"><input name="animals[0][name]" value="d"><input name="animals[0][breed]" value="e"><input name="crazy[1][][wonky]" value="f"><input name="dream[as][vividly][as][you][can]" value="g">
// Output{  "honey":{    "badger":"a"  },  "wombat":["b"],  "hello":{    "panda":["c"]  },  "animals":[    {      "name":"d",      "breed":"e"    }  ],  "crazy":[    null,    [      {"wonky":"f"}    ]  ],  "dream":{    "as":{      "vividly":{        "as":{          "you":{            "can":"g"          }        }      }    }  }}

Usage

$('#my-form').serializeObject();

The Sorcery (JavaScript)

(function($){    $.fn.serializeObject = function(){        var self = this,            json = {},            push_counters = {},            patterns = {                "validate": /^[a-zA-Z][a-zA-Z0-9_]*(?:\[(?:\d*|[a-zA-Z0-9_]+)\])*$/,                "key":      /[a-zA-Z0-9_]+|(?=\[\])/g,                "push":     /^$/,                "fixed":    /^\d+$/,                "named":    /^[a-zA-Z0-9_]+$/            };        this.build = function(base, key, value){            base[key] = value;            return base;        };        this.push_counter = function(key){            if(push_counters[key] === undefined){                push_counters[key] = 0;            }            return push_counters[key]++;        };        $.each($(this).serializeArray(), function(){            // Skip invalid keys            if(!patterns.validate.test(this.name)){                return;            }            var k,                keys = this.name.match(patterns.key),                merge = this.value,                reverse_key = this.name;            while((k = keys.pop()) !== undefined){                // Adjust reverse_key                reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), '');                // Push                if(k.match(patterns.push)){                    merge = self.build([], self.push_counter(reverse_key), merge);                }                // Fixed                else if(k.match(patterns.fixed)){                    merge = self.build([], k, merge);                }                // Named                else if(k.match(patterns.named)){                    merge = self.build({}, k, merge);                }            }            json = $.extend(true, json, merge);        });        return json;    };})(jQuery);


What's wrong with:

var data = {};$(".form-selector").serializeArray().map(function(x){data[x.name] = x.value;});