简体   繁体   English

如何在数组中对 object 进行分组

[英]How to group object inside array

Here is what I have这是我所拥有的

 [
   {
     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',
   }
 ]

First I want to group typeProgramId if the title have the same typeProgramId I want to push title into array by each typeProgramId but If the data have typeProgramId and subTypeProgram Id I want to group subtypeProgramId in typeProgramId too.首先,如果标题具有相同的 typeProgramId,我想对 typeProgramId 进行分组,我想按每个 typeProgramId 将标题推送到数组中,但是如果数据具有 typeProgramId 和 subTypeProgram Id,我也想在 typeProgramId 中对 subtypeProgramId 进行分组。 if not empty subtypeProgramId I want to push it in array title inside subtypeProgram Id.如果不为空 subtypeProgramId 我想将它推送到 subtypeProgram Id 内的数组标题中。 I try to use lodash groupBy and many way but it still did not work.我尝试使用 lodash groupBy 和多种方式,但它仍然不起作用。

Here is what I want这就是我想要的

{
    typeProgramId: [{
        name: 'type1',
        title: [
            'test1',
        ],
        subTypeProgramId: {
            name: sub1,
            title: [
                'test2'
            ]
        }
    }, {
        name: 'type2',
        title: [
            'test3',
        ],
        subTypeProgramId: [{
            name: sub1,
            title: [
                'test4'
            ]
        }
    }]
}

what I do now我现在应该做什么

  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,
    }
  })

Please check the below code.请检查以下代码。 I have used reduce function of Array.我使用了reduce数组的 function。 It produces the expected result.它产生了预期的结果。


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: []});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM