从Javascript数组创建JSON对象
因此,对于每个选中的复选框,我将获得关联的id,并根据其中的值推断节点值,这很好。我面临的问题是使用所有复选框中的值创建一个适当的javascript对象 这是函数从Javascript数组创建JSON对象,javascript,json,Javascript,Json,因此,对于每个选中的复选框,我将获得关联的id,并根据其中的值推断节点值,这很好。我面临的问题是使用所有复选框中的值创建一个适当的javascript对象 这是函数 function finlizeJParams() { var jsonOutput=[]; var array = $("input[type='checkbox']:checked").map
function finlizeJParams()
{
var jsonOutput=[];
var array = $("input[type='checkbox']:checked").map(function(){
var str=this.id;
var data=[];
var objID=str.substring(str.lastIndexOf("c_")+2,str.lastIndexOf("_n_"));
var objName=str.substring(str.lastIndexOf("_n_")+3,str.lastIndexOf("_p_"));
var objParentID=str.substring(str.lastIndexOf("_p_")+3,str.lastIndexOf("_pn_"));
var objParentName=str.substring(str.lastIndexOf("_pn_")+4);
data['ItemID']=objID;
data['ItemName']=objName;
data['ItemParentID']=objParentID;
data['ItemParentName']=objParentName;
jsonOutput.push(data)
return jsonOutput;
}).get()
JSON.stringify(array);
}
当我尝试在控制台上打印阵列时,这似乎起到了作用,请参见下文
0: Array[0]
ItemParentName: "Fruit"
ItemParentID: "7"
ItemID: "8"
ItemName: "Apple"
1: Array[0]
ItemParentName: "Fruit"
ItemParentID: "7"
ItemID: "9"
ItemName: "Orange"
但是,如果我执行JSON.stringify(jsonOutput),我会得到空数组[]、[]?我做错了什么?另外,如何按parentID/Name对这些数组进行分组,然后转换为JSON对象?您将数组视为普通对象 虽然数组继承自对象,但它们是为数字索引的顺序数据而设计的,当您通过
JSON.stringify
传递它们时,只会包含带有数字值的属性
如果要使用命名键,请使用对象({}
),而不是数组([]
)
将数组视为普通对象 虽然数组继承自对象,但它们是为数字索引的顺序数据而设计的,当您通过
JSON.stringify
传递它们时,只会包含带有数字值的属性
如果要使用命名键,请使用对象({}
),而不是数组([]
)
我无法立即看到错误,但您似乎混淆了解决问题的几种方法:您正在使用
.map()
(将一个数组转换为另一个数组),但实际上没有从回调返回任何内容,因此这与您执行。每个(在数组上循环,没有显式结果)的情况相同;我不知道.get()
到底在做什么。是的,在试图解决这个问题时,不知怎么搞砸了。代码现在已更新。您仍然在将函数映射到数组上,并使用外部累加器在数组上循环:jsonOutput
对数组的所有迭代都是全局的,并且在每个循环上都添加到它;因此,您将在第一次添加1项,第二次添加2项,第三次添加3项,以此类推。或者使用.each
并保留jsonOutput
作为累加器(删除var数组=
),或者使用.map
每次只返回数据(删除对jsonOutput
的所有引用)。实际上,这比我想象的更糟糕:通过每次返回同一个对象,您最终会向同一个对象添加多个引用,jQuery只会在最后将其展平,因此3个项的结果数组包含这3个项的处理版本,重复3次。当尝试在JS中“分组”数据时,数组和对象之间还有另一个重要区别:数组定义了顺序,但会自动设置关键点;对象具有由您决定的键,但没有定义的顺序。如果类别的顺序无关紧要,那么像cats={'cat1':[item1,item2],'cat2':[item3,item4]}
这样的结构就可以工作;如果需要使类别有序,则需要更像cats=[{'name':'cat1','items':[item1,item2],'name':'cat2','items':[item3,item4]}]
。在将代码放入循环之前,请尝试手动添加到某些结构中。我无法立即看到错误,但您似乎混淆了解决问题的几种方法:您正在使用.map()
(将一个数组转换为另一个数组),但实际上没有从回调中返回任何内容,因此这与使用时一样。每个(在没有显式结果的数组上循环);我不知道那是什么
在最后做了。是的,试图解决这个问题时,不知怎么搞砸了。代码现在更新了。你仍然在混合映射数组上的函数和使用外部累加器在数组上循环:jsonOutput
对数组的所有迭代都是全局的,并且你在每个循环上都添加了它;因此你将在第一个时间添加一项e左右,2在2,3在3,等等。或者使用.each
并保持jsonOutput
作为累加器(删除var数组=
),或者使用.map
每次只返回数据(删除对jsonOutput
的所有引用).事实上,这比我想象的更糟:通过每次返回同一个对象,您最终会向同一个对象添加多个引用,而jQuery只会在最后将其展平,因此3个项的结果数组包含这3个项的处理版本,重复3次。尝试“分组”时数据在JS中,数组和对象之间还有另一个重要区别:数组定义了顺序,但自动设置了键;对象有键,由您决定,但没有定义顺序。如果类别的顺序无关紧要,那么类似于cats={'cat1':[item1,item2],'cat2':[item3,item4]}
将起作用;如果您需要使类别有序,它需要更像cats=[{'name':'cat1','items':[item1,item2],'name':'cat2','items':[item3,item4]}]
。在将代码放入循环之前,请尝试手动添加到某些结构中。
var data={};