Created
September 20, 2010 20:07
-
-
Save dvv/588561 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function form2obj(){ | |
var r = {}; | |
// for all enabled? inputs | |
$(':input[name]', $(this)).each(function(i, field){ | |
// get the field | |
var $field = $(field); | |
// sanitize field value | |
var value = $field.val(); | |
// we don't store empty values | |
if (!value) return; | |
var type = $field.attr('type'); | |
// TODO: what with selects? | |
// IE7 reports array for select option! | |
if (value instanceof Array) value = value[0]; | |
// shim types for <HTML5 browsers | |
if (type === 'text') type = $field.attr('data-type'); | |
// field type determines its value transformation | |
if (type === 'checkbox') { | |
value = $field.is(':checked'); | |
if (!value && !$field.attr('required')) return; // N.B. we ignore unset checkboxes unless they're required | |
} else if (type === 'number') { | |
// FIXME: do we need integers?! | |
value = parseFloat(value); | |
} else if (type === 'isodate') { | |
//value = Date.toDB(value); | |
var x = value; | |
// four-digit year | |
x = '0000'.substr(0,4-x.length)+x; | |
// pattern for partial dates | |
x += '0000-01-01T00:00:00.000Z'.substring(x.length); | |
x = Date.parse(x.replace(/-/g,'/').replace('T', ' ').replace(/\.\d+Z$/,'')); | |
if (!isNaN(x) && typeof x === 'number') { | |
x = new Date(x); | |
} | |
if (x instanceof Date) x = x.toJSON(); | |
value = x; | |
} | |
//console.log('KV', $field.attr('name'), value, type, typeof value, value instanceof Array); | |
// put a key-value | |
var name = $field.attr('name'); | |
var path, p; | |
// split name to path components | |
path = name.replace(/\]/g, '').replace(/\[/g, '.').split('.'); | |
var o = r; | |
// in resulting object sequentially create all path components | |
while (p = path.shift()) { | |
if (!o[p]) { | |
// N.B. handle arrays: if next path component looks like a number -- create array, otherwise object | |
o[p] = !path.length || isNaN(+path[0]) ? {} : []; | |
} | |
// to leaf assign the value | |
if (!path.length) { | |
o[p] = value; | |
} | |
o = o[p]; | |
} | |
}); | |
return r; | |
} |
It misses shim for boolean values (by default browsers report value of "on" for checked checkboxes and nothing for unchecked; this can be fixed, but requires additional markup). It does guesswork for coercion which is not 100% valid.
The gist is supposed to point out the way json-schema validator could work at server-side, allowing for completely JS-less forms with rails-style nested parameters.
NVL, thanks for the link.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
There's a partial implementation of this here: http://jupiterjs.com/pages/javascriptmvc#news/convert-form-elements-to-javascript-object-literals-with-jquery-formparams-plugin http://v3.javascriptmvc.com/jquery/dist/jquery.formparams.js