如何格式化JSON对象数组(Javascript)
我正在与一个我不知道如何处理的苛刻要求作斗争 我收到一个数组,如下所示:如何格式化JSON对象数组(Javascript),javascript,arrays,json,lodash,Javascript,Arrays,Json,Lodash,我正在与一个我不知道如何处理的苛刻要求作斗争 我收到一个数组,如下所示: [{ "student": "21_A_1", "sport": "badminton" }, { "student": "21_C_1", "sport": "badminton" }, { "student": "21_A_2", "sport": "badminton" }, { "student": "21_B_1", "sport": "footba
[{
"student": "21_A_1",
"sport": "badminton"
}, {
"student": "21_C_1",
"sport": "badminton"
}, {
"student": "21_A_2",
"sport": "badminton"
}, {
"student": "21_B_1",
"sport": "football"
}, {
"student": "21_A_2",
"sport": "football"
}]
要求:将其转换为具有以下格式的数组:
[{
"student": "21_A_1",
"sport": ["badminton"]
}, {
"student": "21_C_1",
"sport": ["badminton"]
}, {
"student": "21_A_2",
"sport": ["badminton","football"]
}, {
"student": "21_B_1",
"sport": ["football"]
}]
我发现库中有一个功能组,返回了非常封闭的结果,但不是预期的结果:
_.groupBy(array, 'student');
结果:
{
"21_A_1": [{
"student": "21_A_1",
"sport": "badminton"
}],
"21_C_1": [{
"student": "21_C_1",
"sport": "badminton"
}],
"21_A_2": [{
"student": "21_A_2",
"sport": "badminton"
}, {
"student": "21_A_2",
"sport": "football"
}],
"21_B_1": [{
"student": "21_B_1",
"sport": "football"
}]
}
非常感谢您的建议。我们可以使用数组的“.reduce”函数并聚合结果,如下所示 var测试=[{ 学生:21_A_1, 运动项目:羽毛球 }, { 学生:21_C_1, 运动项目:羽毛球 }, { 学生:21岁, 运动项目:羽毛球 }, { 学生:21_B_1, 运动:足球 }, { 学生:21岁, 运动:足球 }] const result=test.reduceres,x=>{ res[x.student]=res[x.student]|{学生:x.student,体育:[] res[x.student].sport.pushx.sport 返回res; },{}
console.logresult我们可以使用数组的“.reduce”函数,聚合结果如下 var测试=[{ 学生:21_A_1, 运动项目:羽毛球 }, { 学生:21_C_1, 运动项目:羽毛球 }, { 学生:21岁, 运动项目:羽毛球 }, { 学生:21_B_1, 运动:足球 }, { 学生:21岁, 运动:足球 }] const result=test.reduceres,x=>{ res[x.student]=res[x.student]|{学生:x.student,体育:[] res[x.student].sport.pushx.sport 返回res; },{}
console.logresult您需要将分组项目与其运动属性进行映射,并使用分组信息构建新对象 var数组=[{学生:21_A_1,运动:羽毛球},{学生:21_C_1,运动:羽毛球},{学生:21_A_2,运动:羽毛球},{学生:21_B_1,运动:足球},{学生:21_A_2,运动:足球}], 分组=\u数组 .groupBy'student' .mapgroup,student=>{student,sport:{uu.mapgroup,'sport'} 价值 console.loggroup; .作为控制台包装{最大高度:100%!重要;顶部:0;}
您需要将分组项目与其运动属性进行映射,并使用分组信息构建新对象 var数组=[{学生:21_A_1,运动:羽毛球},{学生:21_C_1,运动:羽毛球},{学生:21_A_2,运动:羽毛球},{学生:21_B_1,运动:足球},{学生:21_A_2,运动:足球}], 分组=\u数组 .groupBy'student' .mapgroup,student=>{student,sport:{uu.mapgroup,'sport'} 价值 console.loggroup; .作为控制台包装{最大高度:100%!重要;顶部:0;} 结合使用: 康斯特数据=[{学生:21_A_1,运动:羽毛球},{学生:21_C_1,运动:羽毛球},{学生:21_A_2,运动:羽毛球},{学生:21_B_1,运动:足球},{学生:21_A_2,运动:足球}]; const result=Object.values data.reducea,c=>a[c.student]=a[c.student]|{学生:c.student,sport:[]}.sport.pushc.sport,a,{} ; console.logresult 结合使用: 康斯特数据=[{学生:21_A_1,运动:羽毛球},{学生:21_C_1,运动:羽毛球},{学生:21_A_2,运动:羽毛球},{学生:21_B_1,运动:足球},{学生:21_A_2,运动:足球}]; const result=Object.values data.reducea,c=>a[c.student]=a[c.student]|{学生:c.student,sport:[]}.sport.pushc.sport,a,{} ;
console.logresult;最好是你自己构造算法,而不是为此使用lodash…最好是你自己构造算法,而不是为此使用lodash…非常感谢快速解决方案,所有都在工作,但是,我标记这是答案,因为我正在使用lodash。我不知道哪一个是最佳实践,所以如果你们有任何最佳实践,请继续分享。因为数组最多可以包含数千个项目。非常感谢您提供的快速解决方案,所有项目都正常工作,但是,我将此标记为答案,因为我使用的是lodash。我不知道哪一个是最佳实践,所以如果你们有任何最佳实践,请继续分享。因为阵列最多可以包含数千项。