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;});