15

我的网站上有这样的表格:

<form id="myform" action="" method="">
 <input type="text" name="name[1][first]">
 <input type="text" name="name[2][first]">
 <input type="text" name="name[3][first]">
</form>

我想简单地获取所有数据并将其发送到网络服务,所以有这个 js:

$fields = $('#myform').serializeArray();

问题是,它使用输入名称中显示的所有括号创建了 json,所以我得到一个解析错误。

如何使用 serializeArray 并获得正确的 json?

我想看到的结果格式是这样的:

{
  "name": {
    "1": {
      "first": "val1"
    },
    "2": {
      "first": "val2"
    },
    "3": {
      "first": "val3"
    }
  }
}

谢谢!

4

5 回答 5

16

我做了一个递归函数/插件来做到这一点:

$.fn.serializeControls = function() {
  var data = {};

  function buildInputObject(arr, val) {
    if (arr.length < 1)
      return val;  
    var objkey = arr[0];
    if (objkey.slice(-1) == "]") {
      objkey = objkey.slice(0,-1);
    }  
    var result = {};
    if (arr.length == 1){
      result[objkey] = val;
    } else {
      arr.shift();
      var nestedVal = buildInputObject(arr,val);
      result[objkey] = nestedVal;
    }
    return result;
  }

  $.each(this.serializeArray(), function() {
    var val = this.value;
    var c = this.name.split("[");
    var a = buildInputObject(c, val);
    $.extend(true, data, a);
  });
  
  return data;
}

$("#output").html(JSON.stringify($('#myform').serializeControls(), null, 2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<form id="myform" action="" method="">
 <input type="text" name="name[1][first]" value="beep">
 <input type="text" name="name[1][second]" value="bloop">
 <input type="text" name="name[2][first]" value="derp">
  
 <input type="text" name="foo" value="bar">  
</form>

<pre id="output">
</pre>

除了整个form. 例如,调用:

$('input[name^="name\\["]').serializeControls()

将返回一个仅包含name字段的对象。有关更多示例,请参见http://codepen.io/alexweissman/pen/MyWZdN

请注意(目前),这不适用于带空括号的字段名称(例如,字段 likeinput name="potatoes[]"将被忽略,因为无法提取唯一键)。

于 2016-02-28T23:29:24.483 回答
3

这是 alexw 代码的一个版本,适用于带空括号的字段名称。这允许您管理具有多个值的字段(复选框、选择多个)。

$j.fn.serializeObject = function() {
    var data = {};

    function buildInputObject(arr, val) {
        if (arr.length < 1) {
            return val;  
        }
        var objkey = arr[0];
        if (objkey.slice(-1) == "]") {
            objkey = objkey.slice(0,-1);
        }  
        var result = {};
        if (arr.length == 1){
            result[objkey] = val;
        } else {
            arr.shift();
            var nestedVal = buildInputObject(arr,val);
            result[objkey] = nestedVal;
        }
        return result;
    }

    function gatherMultipleValues( that ) {
        var final_array = [];
        $j.each(that.serializeArray(), function( key, field ) {
            // Copy normal fields to final array without changes
            if( field.name.indexOf('[]') < 0 ){
                final_array.push( field );
                return true; // That's it, jump to next iteration
            }

            // Remove "[]" from the field name
            var field_name = field.name.split('[]')[0];

            // Add the field value in its array of values
            var has_value = false;
            $j.each( final_array, function( final_key, final_field ){
                if( final_field.name === field_name ) {
                    has_value = true;
                    final_array[ final_key ][ 'value' ].push( field.value );
                }
            });
            // If it doesn't exist yet, create the field's array of values
            if( ! has_value ) {
                final_array.push( { 'name': field_name, 'value': [ field.value ] } );
            }
        });
        return final_array;
    }

    // Manage fields allowing multiple values first (they contain "[]" in their name)
    var final_array = gatherMultipleValues( this );

    // Then, create the object
    $j.each(final_array, function() {
        var val = this.value;
        var c = this.name.split('[');
        var a = buildInputObject(c, val);
        $j.extend(true, data, a);
    });

    return data;
};
于 2017-11-03T06:15:17.663 回答
0

鉴于您已成功将数组序列化为$fields,您现在可以遍历它并将其转换为更易于消化的结果对象:

var result = {};
for(var i in $fields) {
   var parts = $fields[i].name.split("[");
   var resultIndex = parseInt(parts[1].replace(']', ''), 10);
   result[resultIndex] = $fields[i].value; 
}

虽然$fields是全局变量的有效名称,但我不能对此事保持沉默:在 JavaScript 中,局部变量是用var关键字定义的,并且它们前面没有美元符号 - 美元符号通常是指 jQuery 对象。因此,您可以通过调用来获取字段:

var fields = $('#myform').serializeArray();
于 2012-06-20T20:04:45.787 回答
0

我使用serializeArray()了功能它解决了我的问题

 let fd = $( "input[name^='INPUT_NAME']" ).serializeArray();
于 2020-08-30T15:39:43.497 回答
0

如果serializeArray()它写入输入数组。但是它用名称'imputName []'保存它,问题是提取它。但在这里我有一个解决方案。请检查代码语法。

var formArraySerializado = $("#form").serializeArray();

var imputArray = [];

$(formArraySerializado).each(function(i, field){
    
    row[field.name] = field.value;

    if (field.name.indexOf("imputArray[]") >=0){
        imputArray.push(field.value)
    }
});
于 2021-12-15T15:19:45.417 回答