在javascript中将JSON列表合并为一个JSON

在javascript中将JSON列表合并为一个JSON,javascript,json,Javascript,Json,我有一个HTML表单,我正在尝试使用javascript将其内容字符串化并解析为JSON 例如: <form id="form1" enctype="multipart/form-data"> <input type="hidden" name="presented" value="1" /> <input type="checkbox" name="RESPONSE" value="ch1">ch1</input> <

我有一个HTML表单,我正在尝试使用javascript将其内容字符串化并解析为JSON

例如:

<form id="form1" enctype="multipart/form-data">
    <input type="hidden" name="presented" value="1" />
    <input type="checkbox" name="RESPONSE" value="ch1">ch1</input>
    <input type="checkbox" name="RESPONSE" value="ch2">ch2</input>
    <input type="checkbox" name="RESPONSE" value="ch3">ch3</input>

    <input id="submit_button" name="submit" type="submit"/>
</form>
我得到这样的输出(考虑到只有前两个复选框被选中):

但我期望在一个JSON中得到这个结果,其中包含重复键的数组:

{"presented" : "1", "RESPONSE" : ["ch1", "ch2"]}

JSFIDLE

我认为新对象的值应该始终是一个一致性数组。以下是如何构建它:

var arr = [{"name":"presented","value":"1"},
 {"name":"RESPONSE","value":"ch1"},
 {"name":"RESPONSE","value":"ch2"}];

var newObj = {};
arr.forEach(function(item){
    if(!newObj.hasOwnProperty(item.name)){
        newObj[item.name] = [];
    }

    newObj[item.name].push(item.value);
});
这里有一种方法可以完全按照您的需要构建它:

var newObj = {};
arr.forEach(function (item) {
    if (!newObj.hasOwnProperty(item.name)) {
        newObj[item.name] = item.value;
    } else {
        if (Object.prototype.toString.call(newObj[item.name]) !== '[object Array]') {
            var newItem = newObj[item.name];
            newObj[item.name] = [newItem];
        }
        newObj[item.name].push(item.value);
    }
});

考虑JSON解析库之外的其他问题。这是一个非常简单的Java程序,它使用String.split()方法将Json字符串转换为name>,而不使用任何库。

您需要编写自己的序列化程序。例如,要对同名元素的值进行分组,可以使用
Array.prototype.reduce

$(“提交”按钮)。单击(功能(e){
e、 预防默认值();
var formData=jQuery('#form1').serializeArray().reduce(函数(prev,curr){
if(上一个hasOwnProperty(当前名称)){
上一个[货币名称]=$.isArray(上一个[货币名称])?上一个[货币名称]:[上一个[货币名称]]
上一个[curr.name].push(curr.value);
}
否则{
上一个[当前名称]=当前值;
}
返回上一个;
}, {});
document.querySelector('pre').innerHTML=JSON.stringify(formData,null,4);
});

ch1
亚甲基
甲基

输入元素不能有子节点或结束标记。请确认您正在从序列化数组获取预期输出。如果您想要不同的数据结构,那么您需要自己构建它或找到不同的库函数。
var arr = [{"name":"presented","value":"1"},
 {"name":"RESPONSE","value":"ch1"},
 {"name":"RESPONSE","value":"ch2"}];

var newObj = {};
arr.forEach(function(item){
    if(!newObj.hasOwnProperty(item.name)){
        newObj[item.name] = [];
    }

    newObj[item.name].push(item.value);
});
var newObj = {};
arr.forEach(function (item) {
    if (!newObj.hasOwnProperty(item.name)) {
        newObj[item.name] = item.value;
    } else {
        if (Object.prototype.toString.call(newObj[item.name]) !== '[object Array]') {
            var newItem = newObj[item.name];
            newObj[item.name] = [newItem];
        }
        newObj[item.name].push(item.value);
    }
});