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(对象)
写入函数