📌  相关文章
📜  javascript 按对象数组分组 - Javascript (1)

📅  最后修改于: 2023-12-03 15:31:43.120000             🧑  作者: Mango

JavaScript按对象数组分组

在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可以更好地保留键的类型,而且代码也更加简洁易懂。

参考资料: