Javascript 对象的嵌套reduce函数

Javascript 对象的嵌套reduce函数,javascript,arrays,object,reduce,recursion,Javascript,Arrays,Object,Reduce,Recursion,我正在尝试减少已经减少的数组,在第二次减少函数之后,我的对象出现问题。第二次函数运行之前的我的对象如下所示: const object = { groupA: [ {name: "Adam", age: 25, Job: "Pharmacist", group: 'groupA'}, {name: "Eric", age: 25, Job: "Vet", group: 'groupA'}, {name: "Bob", age: 25, Job:

我正在尝试减少已经减少的数组,在第二次减少函数之后,我的对象出现问题。第二次函数运行之前的我的对象如下所示:

const object = {
     groupA: [
       {name: "Adam", age: 25, Job: "Pharmacist", group: 'groupA'},
       {name: "Eric", age: 25, Job: "Vet", group: 'groupA'},
       {name: "Bob", age: 25, Job: "Pharmacist", group: 'groupA'},
       {name: "Peter", age: 25, Job: "Vet", group: 'groupA'},
     ],
    groupB: [
       {name: "Adam", age: 25, Job: "Pharmacist", group: 'groupB'},
       {name: "Eric", age: 25, Job: "Vet", group: 'groupB'},
       {name: "Bob", age: 25, Job: "Pharmacist", group: 'groupB'},
       {name: "Peter", age: 25, Job: "Vet", group: 'groupB'},
     ],    


 }

如果我想得到这样的结果,我应该使用什么函数


const object = {
     groupA: {
       pharmacist: [
         {name: "Adam", age: 25, Job: "Pharmacist", group: 'groupA'},
         {name: "Bob", age: 25, Job: "Pharmacist", group: 'groupA'},
      ],
      vet: [
       {name: "Eric", age: 25, Job: "Vet", group: 'groupA'},
       {name: "Peter", age: 25, Job: "Vet", group: 'groupA'},
      ]
     },
     groupB: {
       pharmacist: [
         {name: "Adam", age: 25, Job: "Pharmacist", group: 'groupB'},
         {name: "Bob", age: 25, Job: "Pharmacist", group: 'groupB'},
      ],
       vet: [
        {name: "Eric", age: 25, Job: "Vet", group: 'groupB'},
        {name: "Peter", age: 25, Job: "Vet", group: 'groupB'},
      ]
     }, 


 }


您可以创建一个单独的函数来
reduce()
每个组,然后使用
for..in
中的
将每个组的未缩减数组替换为缩减对象

const object={“groupA”:[{“name”:“Adam”,“age”:25,“Job”:“pharmaticist”,“group”:“groupA”},{“name”:“Eric”,“age”:25,“Job”:“Vet”,“group”:“groupA”},{“name”:“pharmaticist”,“group”:“groupA”},{“name”:“age”:“groupA”},{“Job”:“groupB”:“{“name”:“name”:“Adam”,“age”:25,“Job”:“pharmaticist:25,“职务”:“兽医”,“小组”:“B组”},{“姓名”:“年龄”:25,“职务”:“药剂师”,“小组”:“B组”},{“姓名”:“年龄”:25,“职务”:“兽医”,“小组”:“B组”}
函数groupByJob(arr){
返回arr.reduce((ac,a)=>{
如果(!ac[a.Job]){
ac[a.Job]=[];
}
ac[a.Job].推送(a);
返回ac;
}, {});
}
for(让k进入对象){
object[k]=groupByJob(object[k]);
}

console.log(object)
您可以使用嵌套的
reduce
方法创建按作业分组值的新对象

const object={“groupA”:[{“name”:“Adam”,“age”:25,“Job”:“pharmaticist”,“group”:“groupA”},{“name”:“Eric”,“age”:25,“Job”:“Vet”,“group”:“groupA”},{“name”:“pharmaticist”,“group”:“groupA”},{“name”:“age”:“groupA”},{“Job”:“groupB”:“{“name”:“name”:“Adam”,“age”:25,“Job”:“pharmaticist:25,“职务”:“兽医”,“小组”:“B组”},{“姓名”:“年龄”:25,“职务”:“药剂师”,“小组”:“B组”},{“姓名”:“年龄”:25,“职务”:“兽医”,“小组”:“B组”}
const result=Object.entries(Object.reduce)(r[k,v])=>{
r[k]=v.reduce((r,e)=>{
如果(!r[e.Job])r[e.Job]=[e]
else r[e.Job].push(e)
返回r
}, {})
返回r;
}, {})
console.log(result)
我们可以这样做(嵌套减少):

const输入={
A组:[
{姓名:“亚当”,年龄:25岁,职务:“药剂师”,组别:'groupA'},
{姓名:“埃里克”,年龄:25岁,职务:“兽医”,组别:'groupA'},
{姓名:“鲍勃”,年龄:26岁,职务:“药剂师”,组别:'groupA'},
{姓名:“彼得”,年龄:26岁,职务:“兽医”,组别:'groupA'},
],
B组:[
{姓名:“亚当”,年龄:25岁,职务:“药剂师”,组别:“B组”},
{姓名:“埃里克”,年龄:25岁,职务:“兽医”,组别:“B组”},
{姓名:“鲍勃”,年龄:26岁,职务:“药剂师”,组别:“B组”},
{姓名:“彼得”,年龄:26岁,职务:“兽医”,组别:“B组”},
]
}
常量输出=(属性)=>{
返回Object.entries(输入).reduce((aggObj,[key,val])=>{
const group=val.reduce((groupedObj,item)=>{
if(groupedObj.hasOwnProperty(项[属性]){
groupedObj[item[property]].push(item);
}否则{
groupedObj[item[property]=[item];
}          
返回groupedObj;
}, {});        
aggObj[key]=分组;
返回aggObj;
}, {})
}
console.log(输出('Job'));
//对于年龄,我们也可以这样做:
//console.log(输出('age'));
/*期望输出:*/
/*
常量输出={
A组:{
药剂师:[
{姓名:“亚当”,年龄:25岁,职务:“药剂师”,组别:'groupA'},
{姓名:“鲍勃”,年龄:25岁,职务:“药剂师”,组别:'groupA'},
],
兽医:[
{姓名:“埃里克”,年龄:25岁,职务:“兽医”,组别:'groupA'},
{姓名:“彼得”,年龄:25岁,职务:“兽医”,组别:'groupA'},
]
},
B组:{
药剂师:[
{姓名:“亚当”,年龄:25岁,职务:“药剂师”,组别:“B组”},
{姓名:“鲍勃”,年龄:25岁,职务:“药剂师”,组别:“B组”},
],
兽医:[
{姓名:“埃里克”,年龄:25岁,职务:“兽医”,组别:“B组”},
{姓名:“彼得”,年龄:25岁,职务:“兽医”,组别:“B组”},
]
}, 
}

*/
您可以使用
object.entries()
然后
.map()
将每个值数组根据键
作业
抓取
对象的条目。要对数组值进行分组,可以使用
.reduce()
,方法是将对象与包含每个关联
作业的对象的数组值进行累加。然后,您可以使用
Object.fromEntries()
从映射的条目构建结果对象:

const object={groupA:[{姓名:“亚当”,年龄:25岁,职务:“药剂师”,职务:“兽医”,年龄:25岁,职务:“兽医”,职务:“兽医”,职务:{姓名:“鲍勃”,年龄:25岁,职务:“药剂师”,职务:'groupA'},{姓名:“彼得”,年龄:25岁,职务:“兽医”,职务:'groupA'},职务:[{姓名:“亚当”,年龄:25岁,职务:“药剂师”,职务:'groupB'},{,年龄:25岁,职务:“兽医”,小组:'groupB'},{姓名:“鲍勃”,年龄:25岁,职务:“药剂师”,小组:'groupB'},{姓名:“彼得”,年龄:25岁,职务:“兽医”,小组:'groupB'},],}
const res=Object.fromEntries(Object.entries(Object.map(
([key,arr])=>[key,arr.reduce((acc,obj)=>{
acc[obj.Job]=[…(acc[obj.Job]| |[]),obj];
返回acc;
}, {})]
));

控制台日志(res)您可以使用筛选器和reduce

const对象={
A组:[
{姓名:“亚当”,年龄:25岁,职务:“药剂师”,组别:'groupA'},
{姓名:“埃里克”,年龄:25岁,职务:“兽医”,组别:'groupA'},
{姓名:“姓名”,年龄:25岁,职务:“药剂师”,组别:'groupA'},
{姓名:“姓名”,年龄:25岁,职务:“兽医”,组别:'groupA'},
],
B组:[
{姓名:“亚当”,年龄:25岁,职务:“药剂师”,组别:“B组”},
{姓名:“埃里克”,年龄:25岁,职务:“兽医”,组别:“B组”},
{姓名:“姓名”,年龄:25岁,职务:“药剂师”,组别:'groupB'},
{姓名:“姓名”,年龄:25岁,职务:“兽医”,组别:'groupB'},
],    
}
for(对象中的常量键){
对象[键]=对象[键]
.map(a=>a.Job)
.filter((v,i,c)=>c.indexOf(v)==i)
.reduce((acc,i)=>({…acc[i]:对象[key].filter(p=>p.Job==i)}),{})
}
console.log(对象)
写入函数