如何按对象数组分组

How to group by array of objects

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

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

这有效,除非您专门尝试使用 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);

尝试使用 array.filter()。做一些像

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

newArr 现在是你的数组。

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)