从不同的键:值对创建多级对象

时间:2014-05-27 07:32:57

标签: javascript jquery json

我有一个下面提到的数组,大约有5000个值。 x1,x2,x3的值是随机的,可能有也可能没有相似之处。我想将数组中给出的数据分成一个JSON对象,该对象首先在Group的基础上分组,然后在Block上分组。确信Village的价值永远是独一无二的。 给出:

Array= [ 
    {Group:"A", Block:"Kansas", Village:"Little",x1:12,x2:214,x3:12},
    {Group:"A", Block:"Kansas", Village:"Whinging",x1:12,x2:214,x3:12},
    {Group:"A", Block:"Angeles", Village:"Surrey",x1:12,x2:214,x3:12},
    {Group:"B", Block:"York", Village:"Privet",x1:12,x2:214,x3:12},
    {Group:"B", Block:"Columbia", Village:"Drive",x1:12,x2:214,x3:12},
    {Group:"B", Block:"Yorkshire", Village:"Number",x1:12,x2:214,x3:12}
   ]

想要:

Obj={
     "A": {
           "Kansas":[
                     {Village:"Little",x1:12,x2:214,x3:12},
                     {Village:"Whinging",x1:12,x2:214,x3:12}
                    ],
           "Angeles":[
                     {Village:"Surrey",x1:12,x2:214,x3:12}
                    ]
            },
     "B": {
           "York":[
                     {Village:"Privet",x1:12,x2:214,x3:12}
                    ],
           "Columbia":[
                     {Village:"Drive",x1:12,x2:214,x3:12}
                    ],
           "Yorkshire":[
                     {Village:"Number",x1:12,x2:214,x3:12}
                    ]
            }
    }

我尝试编写执行此操作的函数,但似乎没有工作,并给我一个像我期望的那样的输出,因为值x1,x2和x3是不相似的。此外,没有必要只有3个值。也可能有10或15个。

你们中的任何人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

我认为在这里使用jQuery并不是必需的...... 另外,SinnerShanky说他不知道是否总有三个值(x1 ... xn),所以这不起作用。

这是另一种解决方案:

var obj = {}

arr.forEach(function(v){
    var group = v.Group,
        block = v.Block,
        villageObj = {};
    if (!obj.hasOwnProperty(group)){
        obj[group] = {};
    }
    if(!obj[group].hasOwnProperty(block)){
        obj[group][block] = [];
    }
    villageObj = v; // You should properly clone the object if you don't want to modify your initial object
    delete(villageObj.Group);
    delete(villageObj.Block);
    obj[group][block].push(villageObj);
});

但是,请记住,我使用删除来删除Group和Block,因此这些属性将在您的初始数组中删除

jsfiddle

答案 1 :(得分:0)

保持它有点简单,你可以迭代,检查是否存在某个属性,然后添加到它,如果没有创建它等。

var Obj = {};

$.each(Array, function(_, obj) {
    var o = {}, G = obj.Group, B = obj.Block;

    $.each(obj, function(key, val) {
        if ( $.inArray(key, ['Group', 'Block']) == -1 ) o[key] = val;
    });

    if ( ! (G in Obj) ) Obj[G] = {};
    B in Obj[G] ? Obj[G][B].push(o) : Obj[G][B] = [o];
});

FIDDLE

请注意,不保证对象中的顺序,只保证数组,并且这不会更改原始数组。

答案 2 :(得分:0)

所以,如果我理解正确,你试图得到一个字典的所有值(并以某种方式合并它们)。您可以为此目的使用$ .each。

Get key value of dictionary by index in jQuery