Javascript 如何将数组中的对象分组
这是我的Javascript 如何将数组中的对象分组,javascript,node.js,arrays,lodash,Javascript,Node.js,Arrays,Lodash,这是我的 [ { typeProgramId: { name: 'type1', }, title: 'test1', }, { typeProgramId: { name: 'type1', }, subTypeProgramId: [{ name: 'sub1', }], title: 'test2', }, { typeProgr
[
{
typeProgramId: {
name: 'type1',
},
title: 'test1',
},
{
typeProgramId: {
name: 'type1',
},
subTypeProgramId: [{
name: 'sub1',
}],
title: 'test2',
},
{
typeProgramId: {
name: 'type2',
},
title: 'test3',
},
{
typeProgramId: {
name: 'type2',
},
subTypeProgramId: {
name: 'sub2',
},
title: 'test4',
}
]
首先,我想对typeProgramId进行分组,如果标题具有相同的typeProgramId,我想按每个typeProgramId将标题推入数组中,但是如果数据具有typeProgramId和SubsubProgramId,我想在typeProgramId中也对SubsubProgramId进行分组。如果不是空的SubsubprogramID,我想把它推到SubsubprogramID内的数组标题中。我尝试使用lodash groupBy和许多方法,但它仍然不起作用
这是我想要的
{
typeProgramId: [{
name: 'type1',
title: [
'test1',
],
subTypeProgramId: {
name: sub1,
title: [
'test2'
]
}
}, {
name: 'type2',
title: [
'test3',
],
subTypeProgramId: [{
name: sub1,
title: [
'test4'
]
}
}]
}
我现在做什么
let result = _.groupBy(getProgram, function(data) {
return data.typeProgramId
})
result = _.map(result, function(group, data) {
// I think in here I must groupBy subTypeProgramId again
// the data return all string not object after group
return {
typeProgramId: data,
titile: group,
}
})
请检查下面的代码。我使用了数组的
reduce
函数。它产生了预期的结果
function updateMem(mem, prgIndex, val){
if(prgIndex < 0) {
mem.typeProgramId.push({});
prgIndex = mem.typeProgramId.length - 1;
}
mem.typeProgramId[prgIndex].name = val.typeProgramId.name;
if(val.subTypeProgramId){
mem.typeProgramId[prgIndex].subTypeProgramId = Object.assign({}, mem.typeProgramId[prgIndex].subTypeProgramId || {}, {"name" : val.subTypeProgramId.name, "title": []});
mem.typeProgramId[prgIndex].subTypeProgramId.title.push(val.title);
} else {
mem.typeProgramId[prgIndex].title = (mem.typeProgramId[prgIndex].title ? mem.typeProgramId[prgIndex].title : []);
mem.typeProgramId[prgIndex].title.push(val.title);
}
};
arr.reduce((mem, val) => {
var prgIndex = mem.typeProgramId.findIndex((p) => p.name === val.typeProgramId.name);
updateMem(mem, prgIndex, val);
return mem;
}, {typeProgramId: []});
函数updateMem(mem、prgIndex、val){
如果(prgIndex<0){
mem.typeProgramId.push({});
prgIndex=mem.typeProgramId.length-1;
}
mem.typeProgramId[prgIndex].name=val.typeProgramId.name;
if(val.programid){
mem.typeProgramId[prgIndex].subjectprogramid=Object.assign({},mem.typeProgramId[prgIndex].subjectprogramid |{},{“name”:val.subjectprogramid.name,“title”:[]});
mem.typeProgramId[prgIndex].subsubprogramid.title.push(val.title);
}否则{
mem.typeProgramId[prgIndex]。title=(mem.typeProgramId[prgIndex]。title?mem.typeProgramId[prgIndex]。title:[]);
mem.typeProgramId[prgIndex].title.push(val.title);
}
};
arr.reduce((mem,val)=>{
var prgIndex=mem.typeProgramId.findIndex((p)=>p.name==val.typeProgramId.name);
updateMem(mem、prgIndex、val);
返回mem;
},{typeProgramId:[]});
如果您提供了代码,我们可以看到您是否做错了。好的,我会发布,但我刚刚删除了它,所以很快会用我的代码更新,谢谢you@LucaMarzi把我的密码加进去抱歉我刚到家。现在我正在为此工作,我很快会让你知道的。现在我正在努力学习你的代码。非常感谢你。我忘了在ProgramId中添加数组。子程序ID必须在数组中才能更新问题。你能编辑你的答案吗。如果具有相同的子类型,则SubsubProgramId必须是数组,就像typeProgramId一样。我要将val.SubsubProgramId.title推送到相同的val.SubsubProgramId.name中