serializeArrayPlus

by Daniel Flores

JavaScript

var $form = $('form');

$form.submit(function(e) {
    e.preventDefault();
    
    var json = {},
        serializedData = $form.serializeArray();
    
    $.map(serializedData, function(n, i) {
        var arrayMarker = '^';
        
        // Mark Arrays
        n['name'] = n['name'].split('[]').join(arrayMarker);
        
        var nameParts = n['name'].split(/[\[\]]+/),
            section = json;
        
        // Remove trailing empty strings
        if(nameParts[nameParts.length - 1] == "") {
            nameParts.pop();
        }
        
        console.log('length: ' , nameParts.length, nameParts);
        for(var i=0; i < nameParts.length; i++) {
            if(nameParts.hasOwnProperty(i)) {
                var name = nameParts[i],
                    isArray = nameParts.hasOwnProperty(i+1) && nameParts[i+1] === arrayMarker;
                
                if(isArray) { 
                    if(!section.hasOwnProperty(nameParts[i]) && !$.isArray(section[nameParts[i]])) {
                        section[nameParts[i]] = [];
                    }
                }
                
                
                if(i == (nameParts.length - 1)) {
                    if(isArray) {
                        section[name][section[name].length] = n['value'];
                    } else {
                        section[name] = n['value'];
                    }
                } else {
                    section = section[nameParts[i]] = {};
                }
            }
        }
    });
    
    console.log(json);
});