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

Javascript 从不同的键:值对创建多级对象,javascript,jquery,json,Javascript,Jquery,Json,我有一个下面提到的数组,大约有5000个值。x1、x2、x3的值是随机的,可能有相似性,也可能没有相似性。我想将数组中给定的数据合并到一个JSON对象中,首先根据Group分组,然后根据Block分组。毫无疑问,村庄的价值观将永远是独一无二的。 鉴于: 想要: 我试着编写这样的函数,但似乎没有一个函数能够工作,并且给我一个像我期望的那样的输出,因为值x1、x2和x3是不相似的。此外,不必只有3个值。也可能有10或15个 你们谁能帮我一下吗?保持简单,你可以迭代,检查属性是否存在,然后添加到属性中

我有一个下面提到的数组,大约有5000个值。x1、x2、x3的值是随机的,可能有相似性,也可能没有相似性。我想将数组中给定的数据合并到一个JSON对象中,首先根据Group分组,然后根据Block分组。毫无疑问,村庄的价值观将永远是独一无二的。 鉴于:

想要:

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


你们谁能帮我一下吗?

保持简单,你可以迭代,检查属性是否存在,然后添加到属性中,如果不创建属性,等等

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];
});


请注意,不能保证对象中的顺序,只有数组,这不会改变原始数组。

因此,如果我理解正确,您正在尝试获取dict的所有值(并以某种方式合并它们)。为此,您可以每人使用$


我认为在这里使用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);
});
但是,请记住,我使用delete删除了Group和Block,因此这些属性也将在初始数组中删除


非常感谢!工作完美。:)
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];
});
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);
});