📅  最后修改于: 2023-12-03 15:31:43.120000             🧑  作者: Mango
在JavaScript中,我们经常会遇到需要按照某个对象数组属性来分组的情况。例如,我们有一个存储着学生信息的对象数组,我们希望按照学生的年级来分组。我们可以用以下的代码来实现:
let students = [
{ name: 'Alice', grade: 9 },
{ name: 'Bob', grade: 10 },
{ name: 'Charlie', grade: 9 },
{ name: 'David', grade: 11 },
{ name: 'Eva', grade: 10 },
];
const groupByGrade = students.reduce((acc, student) => {
if (!acc[student.grade]) {
acc[student.grade] = [student];
} else {
acc[student.grade].push(student)
}
return acc;
}, {});
console.log(groupByGrade);
// Output: {
// 9: [
// { name: 'Alice', grade: 9 },
// { name: 'Charlie', grade: 9 }
// ],
// 10: [
// { name: 'Bob', grade: 10 },
// { name: 'Eva', grade: 10 }
// ],
// 11: [
// { name: 'David', grade: 11 }
// ]
//}
上述代码使用了reduce方法,初始值为一个空对象。在每一次迭代中,我们检查是否已经存在该年级的学生数组,如果不存在就创建一个新的数组,然后把该学生对象加入到数组中。最后返回该对象,就得到了按年级分组的结果。
该方法可以应用于任何对象数组,并且可根据不同的属性进行分组。另外,该方法也可以使用ES6的Map来实现,代码如下:
const groupByGrade = students.reduce((acc, student) => {
acc.set(student.grade, [...(acc.get(student.grade) || []), student])
return acc;
}, new Map());
与上一种方法相比,使用Map可以更好地保留键的类型,而且代码也更加简洁易懂。
参考资料: