Javascript 动态定义JSON-can';我找不到我做错了什么
我试图将表单内容动态地放入JSON中。 它以前工作过,但在我添加了一个额外的层(数组中的数组)之后,似乎有一些地方我做错了: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'
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);