从Javascript数组创建JSON对象

从Javascript数组创建JSON对象,javascript,json,Javascript,Json,因此,对于每个选中的复选框,我将获得关联的id,并根据其中的值推断节点值,这很好。我面临的问题是使用所有复选框中的值创建一个适当的javascript对象 这是函数 function finlizeJParams() { var jsonOutput=[]; var array = $("input[type='checkbox']:checked").map

因此,对于每个选中的复选框,我将获得关联的id,并根据其中的值推断节点值,这很好。我面临的问题是使用所有复选框中的值创建一个适当的javascript对象

这是函数

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={};