我有一个下面提到的数组,大约有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个。
你们中的任何人可以帮助我吗?
答案 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,因此这些属性将在您的初始数组中删除 。
答案 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];
});
请注意,不保证对象中的顺序,只保证数组,并且这不会更改原始数组。
答案 2 :(得分:0)
所以,如果我理解正确,你试图得到一个字典的所有值(并以某种方式合并它们)。您可以为此目的使用$ .each。