Javascript 按数组中的多个属性分组

Javascript 按数组中的多个属性分组,javascript,arrays,object,grouping,reduce,Javascript,Arrays,Object,Grouping,Reduce,通过多个属性对数组进行分组,我可以使用单个属性进行分组,但我无法使用两个属性获得正确的输出 我有一个这样的数组 var grouping= [ { name: "Micheal", branch: "arts", school: "little star" }, { name: "james",

通过多个属性对数组进行分组,我可以使用单个属性进行分组,但我无法使用两个属性获得正确的输出

我有一个这样的数组

var grouping=
    [
     {
        name: "Micheal", 
        branch: "arts",
        school: "little star"
      },
      {
        name: "james", 
        branch: "science",
        school: "little flower"
      },
      {
        name: "Harry", 
        branch: "arts",
        school: "little star"
      },
      {
        name: "emma", 
        branch: "science",
        school: "little flower"
      },
      {
        name: "Schmitt,", 
        branch: "zoology",
        school: "Buds And Flowers High School"
      },
      {
        name: "Tobias,", 
        branch: "biology",
        school: "Boarding School"
      }
    ]
我想按(分行、学校)分组 输出应该是

[
  [
    {
    name: "Micheal", 
    branch: "arts",
    school: "little star"
    },
   {
    name: "Harry", 
    branch: "arts",
    school: "little star"
   }
 ], 
  [
   {
    name: "james", 
    branch: "science",
    school: "little flower"
   },
   {
    name: "emma", 
    branch: "science",
    school: "little flowe"
   }
  ],
   {
    name: "Schmitt,", 
    branch: "zoology",
    school: "Buds And Flowers High School"
  },
  {
    name: "Tobias,", 
    branch: "biology",
    school: "Boarding School"
  }
]
我能够使用下面代码中的单个属性(分支)成功地进行分组 分组=数组上方

var hash = Object.create(null),
        result = [];

      this.grouping.forEach(function (a) {
        if (!hash[a['branch']] ) {
          hash[a['branch']] = [];
          result.push(hash[a['branch']]);
        }
        hash[a['branch']].push(a);
      }); 
      console.log( result)
任何帮助都将不胜感激


谢谢

按数组索引分组可能不是理想的未来证明。我建议按键分组,然后您可以通过引用键简单地提取整个对象

像这样

让所有_数据=[{
姓名:“Micheal”,
分会:“艺术”,
学校:“小星星”
},
{
姓名:“詹姆斯”,
分支:“科学”,
学校:“小花”
},
{
名字:“哈利”,
分会:“艺术”,
学校:“小星星”
},
{
姓名:“艾玛”,
分支:“科学”,
学校:“小花”
}
];
let items=groupBy(所有_数据“分支”)
for(让分支进入项目)
项目[分支机构]=分组依据(项目[分支机构],“学校”)
log(JSON.stringify(items))
//{
//“艺术”:{
//“小星星”:[
//{“名字”:“迈克尔”,“分部”:“艺术”,“学校”:“小明星”},
//{“名字”:“哈利”,“分部”:“艺术”,“学校”:“小明星”}
//      ]
//   },
//“科学”:{
//“小花”:[
//{“名字”:“詹姆斯”,“分部”:“科学”,“学校”:“小花”},
//{“姓名”:“爱玛”、“分部”:“科学”、“学校”:“小花”}
//      ]
//   }
//}
//按对象键将对象数组分组到对象中
函数groupBy(objectArray,属性){
返回objectArray.reduce((acc,obj)=>{
如果(!acc[obj[property]])
acc[obj[属性]]=[];
acc[obj[属性]]推送(obj);
返回acc;
}, {});

}
您可以生成所需组的组合键,并从收集对象获取值

var data=[{姓名:“迈克尔”,分部:“艺术”,学校:“巨星”},{姓名:“詹姆斯”,分部:“科学”,学校:“小花”},{姓名:“哈里”,分部:“艺术”,学校:“小星”},{姓名:“艾玛”,分部:“科学”,学校:“小花”},{姓名:“施密特”,分部:“动物学”,学校:“花蕾高中”},{名称:“托比亚斯”,分支:“生物学”,学校:“寄宿学校”},
组=[“分行”、“学校”],
结果=对象值(数据减少((r,o)=>{
const key=groups.map(k=>o[k]).join(“|”);
(r[键]??=[])。按(o);
返回r;
}, {}));
console.log(结果);

.as控制台包装{max height:100%!important;top:0;}
在值有一个时添加了
if
标志。该值由筛选函数找到,该函数找到一个值,但没有相同的值。找到值后,solo值仅推送到结果数组

/*
[
[
{
姓名:“Micheal”,
分会:“艺术”,
学校:“小星星”
},
{
名字:“哈利”,
分会:“艺术”,
学校:“小星星”
}
], 
[
{
姓名:“詹姆斯”,
分支:“科学”,
学校:“小花”
},
{
姓名:“艾玛”,
分支:“科学”,
学校:“小流氓”
}
],
{
名称:“施密特,”,
分支:“动物学”,
学校:“花蕾高中”
},
{
名称:“Tobias,”,
分会:“生物学”,
学校:“寄宿学校”
}
]
*/
变量分组=
[
{
姓名:“Micheal”,
分会:“艺术”,
学校:“小星星”
},
{
姓名:“詹姆斯”,
分支:“科学”,
学校:“小花”
},
{
名字:“哈利”,
分会:“艺术”,
学校:“小星星”
},
{
姓名:“艾玛”,
分支:“科学”,
学校:“小花”
},
{
名称:“施密特,”,
分支:“动物学”,
学校:“花蕾高中”
},
{
名称:“Tobias,”,
分会:“生物学”,
学校:“寄宿学校”
}
]
var hash=Object.create(null),
结果=[];
this.grouping.forEach(函数(a){
//此筛选器用于查找solo值。
让solo=grouping.filter((一)=>one.branch==a.branch).length;
让sortBySchool=grouping.filter((一)=>one.school==a.school).length;
//此筛选器用于查找具有2个条件的值。
让sortBy2Condition=grouping.filter((一个)=>
one.school===a.school&&one.branch===a.branch
).长度;
//如果只有值,则只需按结果arry。
如果(solo==1){
结果:推(a);
}否则{
if(!hash[a['branch']]){
散列[a['branch']]=[];
push(散列[a['branch']]);
}
散列[a['branch']].push(a);
}
}); 

console.log(result)
你有没有另一个分支和学校不一样的例子?顺便说一句,你有哪些尝试,哪些不起作用?你的意思是需要满足分组的两个条件?我认为这将帮助你解决你的问题@Nina Scholz编辑的question@TijoJohn是的,需要满足2个条件