Ну, чета я фигню написал.
Ок, мой вариант, во много схожий с уже предложенным. Просто чуть более структурированный:
<!DOCTYPE HTML>
<form action="">
<input name="form.pj" value="1235">
<input name="form.cr" value="123">
<input name="form.app.id" value="1234">
<input name="form.app.fm.id" value="12356">
<script>
var formElement = document.querySelector('form');
var formData = toTree(serializeForm(formElement)).form;
alert(JSON.stringify(formData));
function serializeForm(form) {
return Array.apply(null, form).reduce(function(fields, field) {
fields[field.name] = field.value;
return fields;
}, {});
}
function toTree(object) {
var root = {};
for (var key in object) {
var subtree = root;
var path = key.split('.');
for (var i = 0; i < path.length - 1; i++) {
subtree = subtree[path[i]] || (subtree[path[i]] = {});
}
subtree[path[i]] = object[key];
}
return root;
}
</script>
</form>
Не работает в IE8! Хотя исправить очень просто.