Я думаю, что вы должны сделать следующее: для каждого ввода сначала разделите имя в разделителях (символы «.»). Теперь у вас есть массив имен. Затем вы можете выполнить итерацию по этому массиву, убедившись, что у вашего целевого объекта «сборки» (и подобъектов) есть контейнеры каждый раз, когда вы сталкиваетесь с новым сегментом имени. Когда массив содержит 1 элемент, вы просто добавляете значение.
$.fn.extractObject = function() {
var accum = {};
function add(accum, namev, value) {
if (namev.length == 1)
accum[namev[0]] = value;
else {
if (accum[namev[0]] == null)
accum[namev[0]] = {};
add(accum[namev[0]], namev.slice(1), value);
}
};
this.find('input, textarea, select').each(function() {
add(accum, $(this).attr('name').split('.'), $(this).val());
});
return accum;
});
// ...
var object = $('#myform').extractObject();
Я только что сделал это, так что может быть одна или две ошибки; Я не могу вспомнить, есть ли во всех браузерах «слайс», но я думаю, что они есть.
(редактировать: я забыл самый важный звонок split()
)