Javascript 动态定义JSON-can';我找不到我做错了什么

Javascript 动态定义JSON-can';我找不到我做错了什么,javascript,json,Javascript,Json,我试图将表单内容动态地放入JSON中。 它以前工作过,但在我添加了一个额外的层(数组中的数组)之后,似乎有一些地方我做错了: aJSON = {}; aJSON['properties'] = []; aJSON['options'] = []; aJSON['arrays'] = []; $('input').each(function () { if($(this).attr('name') != undefined) { if($(this).attr('name'

我试图将表单内容动态地放入JSON中。 它以前工作过,但在我添加了一个额外的层(数组中的数组)之后,似乎有一些地方我做错了:

aJSON = {};
aJSON['properties'] = [];
aJSON['options'] = [];
aJSON['arrays'] = [];
$('input').each(function () {
    if($(this).attr('name') != undefined) {
        if($(this).attr('name').indexOf('[]') > -1) {
            if(aJSON['arrays'][$(this).attr('name')] == undefined) {
                aJSON['arrays'][$(this).attr('name')] = [];
            }
            if($(this).is(':checked')) {
                aJSON['arrays'][$(this).attr('name')][$(this).attr('value')] = 1;
            } else {
                aJSON['arrays'][$(this).attr('name')][$(this).attr('value')] = 0;
            }
        } else {
            aJSON['properties'][$(this).attr('name')] = $(this).val();
        }
    }
});

$('select').each(function () {
    if($(this).attr('name') != undefined) {
        aJSON['properties'][$(this).attr('name')] = $(this).val();
    }
});
var array = getUrlVars();
aJSON['options']['type'] = array['type'];
aJSON['options']['id'] = array['id'];
aJSON['options']['view'] = pageSpecificVariables['view'];
前4行只是试用,我也试过:

aJSON = {'properties':[], 'options':[], 'arrays':[]}
但我得到的唯一结果是一个包含空属性、选项和数组数组的对象

在我将所有的值直接放入aJSON之前,它工作得非常好。 但是对于分类,我需要3个类别存在

知道为什么我的价值观没有写在aJSON上吗

编辑
在这里添加了JSFIDLE:

我假设您正在尝试序列化表单

改用jQuery的序列化数组函数

var myform = $("#myform");
var data = JSON.stringify( myform.serializeArray() );
更新

因为您试图使用
数组
对象映射

解决方案:


假设各种输入的
name
value
属性是字符串,而不仅仅是数字,那么应该使用嵌套对象,而不是嵌套数组。您正在尝试使用JavaScript中不可用的关联数组

var-oJSON={};
$('._save,.btn success')。单击(函数(){
oJSON={
属性:{},
选项:{},
数组:{}
};
$('input')。每个(函数(){
if($(this).attr('name')!=未定义){
if($(this).attr('name').indexOf('[]')>-1){
if(oJSON['arrays'][$(this).attr('name')]==未定义){
oJSON['arrays'][$(this.attr('name')]={};
}
如果($(this).is(':checked')){
oJSON['arrays'][$(this.attr('name')][$(this.attr('value'))]=1;
}否则{
oJSON['arrays'][$(this.attr('name')][$(this.attr('value'))]=0;
}
}否则{
oJSON['properties'][$(this.attr('name')]=$(this.val();
}
}
});
$('select')。每个(函数(){
if($(this).attr('name')!=未定义){
oJSON['properties'][$(this.attr('name')]=$(this.val();
}
});
oJSON['options']['type']='user';
oJSON['options']['id']=1;
oJSON['options']['view']=“用户设置”;
控制台日志(oJSON);
});

格布鲁伊克斯纳姆酒店
电子邮件地址
网站
A.
B
C
环烯
奥普斯兰

请展示一个带有HTML和事件句柄的可测试示例感谢您的建议,但这不是我问题的答案:)请更新我的答案。此外,您还可以对代码进行一些重构(请参阅更新)。谢谢您的帮助。这真的很有用!!不客气。再次更新,$el.is(':checked')也进行了重构。您给我的关于性能的答案意义重大!我找到了一种测量差异的方法,它相当大:1.6到1.17。因此,性能提高了约36%。非常感谢!谢谢,我知道这必须很简单:将“[]”改为“{}”。我只是没看见!
    var oJSON = {
        properties: {},
        options: {},
        arrays: {}
    };
    $('input[name]').each(function(){  
        var $el = $(this),
            value = $el.attr("value"),
            name = $el.attr('name');
        if(name.indexOf('[]') >= 0)
        {
            oJSON.arrays[name] = oJSON.arrays[name] || {};
            oJSON.arrays[name][value] = $el.is(':checked') ? 1 : 0;            
        } else {
            oJSON.properties[name] = $el.val();
        }
    });
    $('select[name]').each(function(){
        var $el = $(this);
        oJSON.properties[$el.attr('name')] = $el.val();
    });

    oJSON.options['type'] = 'user';
    oJSON.options['id'] = 1;
    oJSON.options['view'] = 'user-settings';
    console.log(oJSON);