【问题标题】:How to group object inside array如何对数组内的对象进行分组
【发布时间】:2020-11-23 08:51:56
【问题描述】:

这就是我所拥有的

 [
   {
     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 和 subTypeProgram Id,我也想在 typeProgramId 中对 subtypeProgramId 进行分组。如果不为空 subtypeProgramId 我想将它推送到 subtypeProgram Id 内的数组标题中。我尝试使用 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,
    }
  })

【问题讨论】:

  • 如果您提供代码,我们可以查看您是否做错了什么。
  • 好的,我会发布它,但我刚刚删除了它,所以很困惑会尽快更新我的代码谢谢
  • @LucaMarzi 只需将我的代码添加到问题中

标签: javascript node.js arrays lodash


【解决方案1】:

请检查以下代码。我使用了数组的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: []});

【讨论】:

  • 对不起,我刚到家。现在我正在为此工作,我会尽快通知您。
  • 现在可以了,我试着学习你的代码,非常感谢
  • 哦,我忘记将数组添加到 subTypeProgramId 中。 subTypeProgramId 必须在我刚刚更新问题的数组中。你能编辑你的答案吗? subTypeProgramId 必须是数组,就像 typeProgramId 如果有相同的子类型我想将 val.subTypeProgramId.title 推入相同的 val.subTypeProgramId.name
猜你喜欢
  • 1970-01-01
  • 2018-05-01
  • 2021-09-12
  • 2019-05-29
  • 2019-11-20
  • 2021-11-25
  • 2021-03-30
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多