How to convert jQuery.serialize() data to JSON object?

后端 未结 12 2115
感情败类
感情败类 2020-12-02 17:11

Is there any better solution to convert a form data that is already serialized by jQuery function serialize(), when the form contains multiple input Array fields. I want to

相关标签:
12条回答
  • 2020-12-02 17:15

    if you are using ajax requests then no need to make it json-object only $('#sampleform').serialize() works excellently or if you have another purpose here is my solution:

    var formserializeArray = $("#sampleform").serializeArray();   
    var jsonObj = {};
    jQuery.map(formserializeArray , function (n, i) {
        jsonObj[n.name] = n.value;
    });
    
    0 讨论(0)
  • 2020-12-02 17:19

    I'm using this very little jQuery plugin, that I've extended from DocumentCloud:

    https://github.com/documentcloud/documentcloud/blob/master/public/javascripts/lib/jquery_extensions.js

    It is basically two lines of code, but it requires _.js (Underscore.js), since it is based on a reduce function.

    $.fn.extend({
      serializeJSON: function(exclude) {
        exclude || (exclude = []);
        return _.reduce(this.serializeArray(), function(hash, pair) {
          pair.value && !(pair.name in exclude) && (hash[pair.name] = pair.value);
          return hash;
        }, {});
      }
    });
    

    Extensions:

    • It doesn't serialize an input value if it's null
    • It can exclude some inputs by passing an array of input names to the exclude argument i.e. ["password_confirm"]
    0 讨论(0)
  • 2020-12-02 17:19

    An equivalent solution to Danilo Colasso's, with the sames pros and cons of .serializeArray() (basically it uses .reduce instead of $.each).

    With little effort it allows implementing the extra features in S.C.'s answers without requiring extensions.

    $(selector).serializeArray()
        .reduce(function(accum, item) {
            // This 'if' allows ignoring some values
            if (-1 === [ 'ignoreThis', 'andThat' ].indexOf(item.name)) {
                // This allows ignoring NULL values
                if (item.value !== null) {
                    accum[item.name] = item.value;
                }
            }
            return accum;
        },
        {
            // By supplying some initial values, we can add defaults
            // for, say, disabled form controls.
            preFilledName:  preFilledValue, // optional
            defaultName  :  defaultValue    // optional
        }
    );
    
    0 讨论(0)
  • 2020-12-02 17:19

    Using underscore & jQuery

    var formdata = $("#myform").serializeArray();
    var data = {};
    _.each(formdata, function(element){
    // Return all of the values of the object's properties.
      var value = _.values(element);
    // name : value 
      data[value[0]] = value[1];
    });
    console.log(data); //Example => {name:"alex",lastname:"amador"}
    
    0 讨论(0)
  • 2020-12-02 17:20

    I think there're a lot of good answer here, and I made my own function based on these answers.

    function formToJSON(f) {
        var fd = $(f).serializeArray();
        var d = {};
        $(fd).each(function() {
            if (d[this.name] !== undefined){
                if (!Array.isArray(d[this.name])) {
                    d[this.name] = [d[this.name]];
                }
                d[this.name].push(this.value);
            }else{
                d[this.name] = this.value;
            }
        });
        return d;
    }
    
    //The way to use it :
    $('#myForm').submit(function(){
        var datas = formToJSON(this);
        return false;
    });
    

    Well let me explain basically why I prefer this solution... If you have multiples input with the same name, all values will be stored in an Array but if not, the value will be stored directly as the value of the index in the JSON ... This is where it's different from Danilo Colasso's answer where the JSON returned is only based of array values...

    So if you have a Form with a textarea named content and multiples authors, this function will return to you :

    {
        content : 'This is The Content',
        authors : 
            [
                0: 'me',
                1: 'you',
                2: 'him',
            ]
    }
    
    0 讨论(0)
  • 2020-12-02 17:22

    With all Given Answer there some problem which is...

    If input name as array like name[key], but it will generate like this

     name:{
       key : value
     }
    

    For Example : If i have form like this.

        <form>
            <input name="name" value="value" >
            <input name="name1[key1]" value="value1" >
            <input name="name2[key2]" value="value2" >
            <input name="name3[key3]" value="value3" >
        </form>
    

    Then It will Generate Object like this with all given Answer.

    Object {
        name : 'value',
        name1[key1] : 'value1',
        name2[key2] : 'value2',
        name3[key3] : 'value3', 
    }
    

    But it have to Generate like below,anyone want to get like this as below.

    Object {
        name : 'value',
        name1 : {
            key1 : 'value1'
        },
        name2 : {
            key2 : 'value2'
        },
        name3 : {
            key2 : 'value2'
        }
    }
    

    Then Try this below js code.

    (function($){
        $.fn.getForm2obj = function(){
            var _ = {},_t=this;
            this.c = function(k,v){ eval("c = typeof "+k+";"); if(c == 'undefined') _t.b(k,v);}
            this.b = function(k,v,a = 0){ if(a) eval(k+".push("+v+");"); else eval(k+"="+v+";"); };
            $.map(this.serializeArray(),function(n){
                if(n.name.indexOf('[') > -1 ){
                    var keys = n.name.match(/[a-zA-Z0-9_]+|(?=\[\])/g),le = Object.keys(keys).length,tmp = '_';
                    $.map(keys,function(key,i){
                        if(key == ''){
                            eval("ale = Object.keys("+tmp+").length;");
                            if(!ale) _t.b(tmp,'[]');
                            if(le == (i+1)) _t.b(tmp,"'"+n['value']+"'",1);
                            else _t.b(tmp += "["+ale+"]",'{}');
                        }else{
                            _t.c(tmp += "['"+key+"']",'{}');
                            if(le == (i+1)) _t.b(tmp,"'"+n['value']+"'");
                        }
                    });
                }else _t.b("_['"+n['name']+"']","'"+n['value']+"'");
            });
            return _;
        }
    })(jQuery);
    console.log($('form').getForm2obj());
    <!DOCTYPE html><html><head>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <title>Convert form data to JavaScript object with jQuery</title>
    </head>
    <body>
        <form>
            <input name="name" value="value" >
            <input name="name1[key1]" value="value1" >
            <input name="name2[key2]" value="value2" >
            <input name="name3[key3]" value="value3" >
            <input type="checkbox" name="name4[]" value="1" checked="checked">
            <input type="checkbox" name="name4[]" value="2">
            <input type="checkbox" name="name4[]" value="3">
        </form>
    </body></html>

    0 讨论(0)
提交回复
热议问题