Javascript 如何根据特性对对象进行分组

Javascript 如何根据特性对对象进行分组,javascript,node.js,logic,lodash,backend,Javascript,Node.js,Logic,Lodash,Backend,希望有人能帮助我 情况: 我正在开发一个unit report,其中我选择了所有具有unit_id的客户机(unit_id是与unit的关系,它们可以位于何处),该选择是一个对象数组,我在如何根据一个特定属性对对象进行分组方面遇到了问题,我有一个数组,如: const客户端=[ [ { ID:1, 姓名:“约翰·多伊”, 单位:['02'], } ], [ { ID:2, 姓名:“简·多伊”, 单位:['01','02'], } ], [ { ID:3, 名字:“Doe John”, 单位:['

希望有人能帮助我

情况: 我正在开发一个unit report,其中我选择了所有具有unit_id的客户机(unit_id是与unit的关系,它们可以位于何处),该选择是一个对象数组,我在如何根据一个特定属性对对象进行分组方面遇到了问题,我有一个数组,如:

const客户端=[
[
{
ID:1,
姓名:“约翰·多伊”,
单位:['02'],
}
],
[
{
ID:2,
姓名:“简·多伊”,
单位:['01','02'],
}
],
[
{
ID:3,
名字:“Doe John”,
单位:['50','15'],
}
],
[
{
ID:4,
姓名:“Doe Jane”,
单位:['30'],
}
],
[
{
ID:5,
姓名:“Doe Jane”,
单位:['15'],
}
],
]
问题: 我需要使用相同的“单位对每个人进行分组,但我不能将多个组的“单位ID”与我在一个组中的相同,我希望得到如下结果:

const unitGroups=[
[
{
单位识别码:['01','02'],
客户:[
{
ID:1,
姓名:“约翰·多伊”,
}, 
{
ID:2,
姓名:“简·多伊”,
}
]
}
],
[
{
单位识别码:['50','15'],
客户:[
{
ID:3,
名字:“Doe John”,
},
{
ID:5,
姓名:“Doe Jane”,
}
]
}
],
[
{
单位识别码:['30'],
客户:[
{
ID:4,
姓名:“Doe Jane”,
}
]
}
]
]

您可以使用
reduce
来获得结果。下面是一个实现:

const clients=[{ID:1,名称:'John Doe',单位:['02'],}],{ID:2,名称:'Jane Doe',单位:['01','02'],}],{ID:3,名称:'Doe John',单位:['50','15',}],{ID:4,名称:'Doe Jane',单位:['30'],}],{ID:5,名称:'Doe Jane',单位:['15'],}];
const result=客户端。reduce((a,e)=>{
e、 forEach(({UNITS,…rest})=>{
const getIndex=a.findIndex(p=>p.UNIT_id.some(b=>UNITS.some(c=>c==b));
如果(getIndex==-1){
const newData={UNIT_id:UNITS,CLIENTS:[].concat(rest)};
a、 推送(新数据);
}否则{
a[getIndex].UNIT_ID=[…新集合([…a[getIndex].UNIT_ID,…UNITS]);
a[getIndex]。客户端=[…a[getIndex]。客户端,rest]
}
})
返回a;
},[]);
控制台日志(结果)
常量交点=(数组1,数组2)=>
数组1.过滤器((值)=>array2.包括(值));
常量结果=[];
for(clients.flat()的常量{ID,NAME,UNITS}){
const contain=results.find({UNIT_IDS})=>
交叉点(单位ID,单位)。长度
);
如果(包含){
contain.CLIENTS.push({ID,NAME});
if(UNITS.length>contain.UNIT\u id.length){
contain.UNIT_id=单位;
}
继续;
}
结果:推({
单位ID:单位,
客户:[
{ID,NAME},
],
});
}
console.log(results.map((组)=>[group]);