【问题标题】:How to group by array of objects如何按对象数组分组
【发布时间】:2022-01-24 14:02:04
【问题描述】:

我有一个对象数组,如下所示:

const data = [{label: 'ABC', id: '1', emp:{empLabel: 'Test1', empId: '12'}},
{label: 'ABC', id: '1', emp:{empLabel: 'Test2', empId: '13'}},
{label: 'DEF', id: '2', emp:{empLabel: 'Test11', empId: '14'}},
{label: 'DEF', id: '2', emp:{empLabel: 'Test12', empId: '15'}},
{label: 'PQR', id: '3', emp:{empLabel: 'Test13', empId: '16'}},
{label: 'XYZ', id: '4', emp:{empLabel: 'Test14', empId: '17'}}
] 

如果我的 id 相等,我正在尝试合并 emp 数据。

预期输出:

[
{label: 'ABC', id: '1', emp:[{empLabel: 'Test1', empId: '12'}, {empLabel: 'Test2', empId: '13'}]},
{label: 'DEF', id: '2', emp:[{empLabel: 'Test11', empId: '14'}, {empLabel: 'Test12', empId: '15'}]},
{label: 'PQR', id: '3', emp:{empLabel: 'Test13', empId: '16'}},
{label: 'XYZ', id: '4', emp:{empLabel: 'Test14', empId: '17'}}
] 

我曾尝试通过 lodash 执行此操作,但不知道在此之后如何进行。任何帮助将不胜感激?

我的方法:

result = _.map(data, eachData => {
  return _.chain(_.flatMap(eachData))
  
  })

【问题讨论】:

标签: javascript arrays lodash


【解决方案1】:

这行得通,除非您特别尝试使用 lodash:

const result = data.reduce((acc, val) => {
    const existingGroup = acc.find((group) => val.id === group.id);

    if(!!existingGroup) {
        if(existingGroup.emp && Array.isArray(existingGroup.emp)) {
           existingGroup.emp = [...existingGroup.emp, val.emp];
        } else {
          existingGroup.emp = [existingGroup.emp, val.emp]
        }
    } else {
        acc = [...acc, val];
    }
    return acc;
},[]);

console.log(result);

【讨论】:

    【解决方案2】:

    尝试使用 array.filter()。做类似的事情

    ar = []
    let newarr = []
    data.map(x => if (ar.indexOf(x)===-1) {newarr.push(x); at.push(x.id))
    

    newArr 现在是你的数组。

    【讨论】:

      【解决方案3】:
      const _ = require("lodash")
      
      let items = [
          { label: 'ABC', id: '1', emp: { empLabel: 'Test1', empId: '12' } },
          { label: 'ABC', id: '1', emp: { empLabel: 'Test2', empId: '13' } },
          { label: 'DEF', id: '2', emp: { empLabel: 'Test11', empId: '14' } },
          { label: 'DEF', id: '2', emp: { empLabel: 'Test12', empId: '15' } },
          { label: 'PQR', id: '3', emp: { empLabel: 'Test13', empId: '16' } },
          { label: 'XYZ', id: '4', emp: { empLabel: 'Test14', empId: '17' } }
      ]
      
      
      var result = _(items)
          .groupBy('id')
          .map(function(items, label) {
            return {
              label: label,
              emp: _.map(items, 'emp')
            };
          }).value();
      console.log("result -> ", result)
      

      【讨论】:

        猜你喜欢
        • 2018-05-01
        • 1970-01-01
        • 2019-07-25
        • 2021-10-14
        • 2021-11-19
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        相关资源
        最近更新 更多