Javascript 分组Json数组对象
我的源数据是标准JSON格式。但我希望以分组的方式格式化数据,以便可以按Catname和Catid对原始数据进行分组 我在前端尝试了loadash库。但我不想在前端使用它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
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)