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中