Javascript 按多个关键点按对象数组分组,以处理所有关键点

Javascript 按多个关键点按对象数组分组,以处理所有关键点,javascript,arrays,group-by,Javascript,Arrays,Group By,我有以下数据集: const people=[ { 姓名:'皮特', 性别:'男性', 年龄:22 }, { 姓名:“萨曼莎”, 性别:'女性', 年龄:20 }, { 姓名:'弗兰克', 性别:'男性', 年龄:22 }, { 姓名:'加里', 性别:'男性', 年龄:21 }, { 姓名:'玛丽亚', 性别:'女性', 年龄:20 }, { 名字:“汉娜”, 性别:'女性', 年龄:21 }, { 姓名:'皮特', 性别:'男性', 年龄:20 } ]; 并按性别和年龄进行分组。因此,结果

我有以下数据集:

const people=[
{
姓名:'皮特',
性别:'男性',
年龄:22
},
{
姓名:“萨曼莎”,
性别:'女性',
年龄:20
},
{
姓名:'弗兰克',
性别:'男性',
年龄:22
},
{
姓名:'加里',
性别:'男性',
年龄:21
},
{
姓名:'玛丽亚',
性别:'女性',
年龄:20
},
{
名字:“汉娜”,
性别:'女性',
年龄:21
},
{
姓名:'皮特',
性别:'男性',
年龄:20
}
];
并按
性别和
年龄进行分组。因此,结果应该是:

{
男:{
'20':[{姓名:'Pete',性别:'Mean',年龄:20}],
'21':[{姓名:加里,性别:男性,年龄:21}],
'22': [
{姓名:'Pete',性别:'Mean',年龄:22},
{姓名:“弗兰克”,性别:“男性”,年龄:22}
]
},
女性:{
'20': [
{姓名:“萨曼莎”,性别:“女性”,年龄:20},
{姓名:“玛丽亚”,性别:“女性”,年龄:20}
],
'21':[{姓名:汉娜,性别:女性,年龄:21}],
'22': [ ],
}
}
您可以看到
age
键总是
20、21、22
,即使没有22岁的女性

我尝试:

const groupedByMultiple=map(groupBy(数据集,'gender'),函数(obj,键){ 常数temp={} temp[key]=groupBy(对象“年龄”) 返回温度 })

但结果是一个数组而不是一个对象。如何求解?

您可以使用array.reduce从数组中获取对象。它可以通过对数组中的值进行累积来返回您想要的任何内容。
//distinct ages
let distinctAges=[];
people.foeEach(v=>{
if(distimctAges.includes(v.age)){
   distinctAges.push(v.age)
}
})


//init empty assign
let resultObj={
  Male:{},
  Female:{}
};

//assign data
distinctAges.foeEach(v=>{
resultObj.Male[v.age]=filter('Male',v.age);
resultObj.Female[v.age]=filter('Female',v.age);
})

//filter by gender and age
funtion filter(gender,age){
  return people.filter(data=>data.age==age & data.gender==gender);
}

console.log(resultObj);
如果您想要的键在之前就已经知道了,那么通过设置初始值就简单多了

    people.reduce((accumulated, person) => {
     acccumulated[person.gender][person.age].push(person);
     return accumulated;
]}, {
 male: {
20: [],
21: [],
22: []
},
female: {
20: [],
21: [],
22: []
},
});
如果您不知道存在哪些值,您仍然可以通过检查存在哪些值并适当分配来完成

   people.reduce((accumulated, person) => {
         if(acccumulated[person.gender]) {
          const arr = acccumulated[person.gender][person.age] ? acccumulated[person.gender][person.age] : [];
           arr.push(person)
           acccumulated[person.gender][person.age] = arr;
         } else {
         acccumulated[person.gender] = {};
        acccumulated[person.gender][person.age] = [person];
    
         }
         
         return accumulated;
    ]}, {});

您可以从想要的组中获取一组键,并减少用于推送对象的组

const
people=[{姓名:'Pete',性别:'Male',年龄:22},{姓名:'Samantha',性别:'Femal',年龄:20},{姓名:'Frank',性别:'Male',年龄:22},{姓名:'Gary',性别:'Male',年龄:21},{姓名:'Pete',性别:'Male',年龄:20},
组=['性别','年龄'],结果=人。减少((r,o)=>{
组
.reduce((组,k,i,{length})=>group[o[k]]??=i+1==length?[]:{},r)
.推(o);
返回r;
}, {});
控制台日志(结果)
。作为控制台包装{最大高度:100%!重要;顶部:0;}