我的网站上有一个表格,如下:
<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"
}
}
}
谢谢!
答案 0 :(得分:12)
我做了一个递归函数/插件来完成这个:
$.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。
请注意(暂时),这对于带有空括号的字段名称不起作用(例如,input name="potatoes[]"
之类的字段将被忽略,因为无法提取唯一键。)
答案 1 :(得分:2)
这是一个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;
};
答案 2 :(得分: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();
答案 3 :(得分:0)
我使用了serializeArray()
函数可以解决我的问题
let fd = $( "input[name^='INPUT_NAME']" ).serializeArray();