Javascript 分组Json数组对象

Javascript 分组Json数组对象,javascript,arrays,json,grouping,Javascript,Arrays,Json,Grouping,我的源数据是标准JSON格式。但我希望以分组的方式格式化数据,以便可以按Catname和Catid对原始数据进行分组 我在前端尝试了loadash库。但我不想在前端使用它 var originalData = [ { "quesid": 1, "uoptid": 0, "catid": 1, "catname": "Soft Skill" }, { "quesid": 2, "uoptid": 0, "catid": 1, "cat

我的源数据是标准JSON格式。但我希望以分组的方式格式化数据,以便可以按Catname和Catid对原始数据进行分组

我在前端尝试了loadash库。但我不想在前端使用它

var originalData = [
{
    "quesid": 1,
    "uoptid": 0,
    "catid": 1,
    "catname": "Soft Skill"
},
{
    "quesid": 2,
    "uoptid": 0,
    "catid": 1,
    "catname": "Soft Skill"
},
{
    "quesid": 3,
    "uoptid": 0,
    "catid": 2,
    "catname": "Technical"
},
{
    "quesid": 4,
    "uoptid": 0,
    "catid": 2,
    "catname": "Technical"
}
]
要求如下:

        var transformData = [
        { 
          catname: "Soft Skill",
          catid : 1,
          ques : [ 
    {quesid : 1, uotp : 0 },
    {quesid : 2, uotp : 0 }
    ]
},
{
          catname: "Technical",
          catid : 2,
          ques : [ 
    {quesid : 3, uotp : 0 },
    {quesid : 4, uotp : 0 }
    ]
}
   ]

您可以使用
array.prototype.reduce
。如果
ES6
不是问题,则应该是:

var originalData=[{“quesid”:1,“uoptid”:0,“catid”:1,“catname”:“软技能”},{“quesid”:2,“uoptid”:0,“catid”:1,“catname”:“软技能”},{“quesid”:3,“uoptid”:0,“catid”:2,“catname”:“技术”},{“quesid”:4,“uoptid”:0,“catid”:2,“catname”:“技术”};
var grouped=originalData.reduce((m,{quesid,uoptid,catid,catname})=>{
var found=m.find(e=>e.catid==catid);
var quesItem={quesid,uotp:uoptid};
found?found.ques.push(quesItem):m.push({catname,catid,ques:[quesItem]});
返回m;
}, []);

控制台日志(分组)实现这一点的一种方法是创建类别ID的映射,并通过迭代源数组来构建数据。然后可以将生成的映射转换回数组

样本:

var originalData = [{
        "quesid": 1,
        "uoptid": 0,
        "catid": 1,
        "catname": "Soft Skill"
    },
    {
        "quesid": 2,
        "uoptid": 0,
        "catid": 1,
        "catname": "Soft Skill"
    },
    {
        "quesid": 3,
        "uoptid": 0,
        "catid": 2,
        "catname": "Technical"
    },
    {
        "quesid": 4,
        "uoptid": 0,
        "catid": 2,
        "catname": "Technical"
    }
];

var map = originalData.reduce(function (m, d) {
    if (!m[d.catname]) {
        m[d.catname] = {
            catname: d.catname,
            catid: d.catid,
            ques: []
        }
    }
    m[d.catname].ques.push({
        quesid: d.quesid,
        uopt: d.uoptid
    });
    return m;
}, {});
var transformData = Object.keys(map).map(function (key) {
    return map[key];
});

您可以使用一种具有哈希表和一些嵌套循环的直接方法,一个用于给定数据,另一个用于获取组合键

var data=[{quesid:1,uoptid:0,catid:1,catname:“软技能”},{quesid:2,uoptid:0,catid:1,catname:“软技能”},{quesid:3,uoptid:0,catid:2,catname:“技术”},{quesid:4,uoptid:0,catid:2,catname:“技术”},
hash=Object.create(null),
键=[“catid”,“catname”],
i、 j,key,o,
分组=[];
对于(i=0;i

。作为控制台包装{max height:100%!important;top:0;}
发布到目前为止您尝试过的内容,并显示您遇到的问题。此解决方案不起作用,并且由于它使用ES 6,将在IE 8中产生问题。这不起作用。每组只显示一个结果,而不是两个。为了公平起见,您没有提到支持9年浏览器的要求。@fubar它是固定的
hash = OriginalData.reduce((p,c) => (p[c.catname] ? p[c.catname].push(c) : p[c.catname] = [c],p) ,{}),
newData = Object.keys(hash).map(k => ({catname: k, ques: hash[k]}));

console.log(newData)