为了解决JavaScript的对象使用Number或者其他数据类型作为键这个问题,最新的ES6规范引入了新的数据类型Map
。
需求:学校一个年级有很多个班级,每个班级有很多位学生,原始数据是一个数组对象列表,每个对象中包含年级、班级、学生三个属性,想要获取一组:年级=》班级=》学生这样的组合。
代码实现如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 想要得到的结果:// {'一年级' => {'一班' => [], '二班' => []}, '二年级' => {'一班' => [], '二班' => []}, ...}
const datas = [ // 原始数据
{
grade: '一年级',
class: '一班',
name: 'Jack'
},
{
grade: '一年级',
class: '一班',
name: 'Tom'
},
{
grade: '一年级',
class: '二班',
name: 'Aaron'
},
{
grade: '一年级',
class: '三班',
name: 'Dick'
},
{
grade: '二年级',
class: '一班',
name: 'Carl'
},
{
grade: '二年级',
class: '二班',
name: 'Bill'
},
];
const gradeMap = new Map();
datas.map(item => {
gradeMap.set(item.grade, new Map());
});
console.log(gradeMap); // {'一年级' => Map(0), '二年级' => Map(0)}
gradeMap.forEach((value, key) => {
let classMap = new Map();
datas.map(item => {
let arr = [];
if (key == item.grade) { // 从datas中找到当前gradeMap的key对应的年级
if (classMap.get(item.class)) { // 班级Map中已经存在有当前班级的,追加name到其值中
arr = [...classMap.get(item.class), item.name];
classMap.set(item.class, arr);
} else {
arr.push(item.name);
classMap.set(item.class, arr);
}
}
});
console.log(classMap); // {'一班' => Array(2), '二班' => Array(1), '三班' => Array(1)} {'一班' => Array(1), '二班' => Array(1)}
gradeMap.set(key, classMap);
});
console.log(gradeMap); // {'一年级' => Map(3), '二年级' => Map(2)}
</script>
</body>
</html>
最终输出结果: