昨天有一道题,用ES6中的类写一道业务编程题。题目大致如下
需求:
员工类(Staff)
属性:
员工姓名(name)
所在部门名字(departmentName)(是一个字符串)
入职时间(time)(例如:2015 这种格式的字符串即可)
公司类(Company)
属性:部门:(departmentMap) (类型是一个Map,Map的键是部门的名字,值是对应部门的员工数组,员工数组里是每个员工对象)
方法:
1、添加员工
要求:首先员工姓名和入职时间不能同时重复。 如果添加的员工所在部门不存在,你需要帮他
创建该部门,并且加入到该部门中,如果该部门存在直接加入该部门即可。
2、显示所有员工信息的方法
要求:打印格式为
xxx部门:
姓名:小雪 入职时间:2015
姓名:小刚 入职时间:2016
xxx部门:
姓名:xxx 入职时间:xxx
拿到题目之后 感觉很熟悉也很陌生,因为ES6是新学的但是也大都忘记了。
得,回头查查资料吧。
通过复习资料我们可以知道JS中的类的基本写法
class Staff{
//构造器 直指类本身
constructor(参数1,参数2...){
this.属性1 = 参数1;
this.属性2 = 参数2;
...
}
//方法
toString(){
//有默认方法 可以重写
}
//...其它方法
}
弄懂了这个,员工类和公司类的结构就很好写了
//员工类
class Staff{
//构造器
constructor(name,departmentName,time){
//属性
this.name = name;
this.departmentName = departmentName;
this.time = time;
}
}
//公司类结构如下
class Company{
constructor(){
//Map 数据结构 参见ES6新特性课件
this.departmentMap = new Map();
}
addStaff(staff){
//可以省略 不过下面要写好长代码staff.name ...
var name = staff.name;
var departmentName = staff.departmentName;
var time = staff.time;
//遍历判断是否同名同时入职 无法在遍历中操作 立个flag在后面处理
var flag = 0;
//首先判断是否存在部门 如果不存在 直接创建部门 并添加员工到数组 并打印
if(!this.departmentMap.has(departmentName)){
this.departmentMap.set(departmentName,[staff]);
console.log("success");
}else{
//如果存在部门 现获取该部门对应的员工数组
var arr = this.departmentMap.get(departmentName);
//遍历判断新添加的员工是否已存在(通过flag的增量是否等于员工数组的长度)
for(var s of arr){
//不存在 flag++
if(!(name==s.name&&time==s.time)){
flag++;
}
}
//如果flag等于员工数组的长度 说明不存在同时入职同名员工 这时添加 否则打印error
if(flag==arr.length){
arr.push(staff);
console.log("sucess");
}else{
console.log("error");
}
}
}
printStaff(){
//注意参数 是value在前 key在后 还有一个参数 我没用
this.departmentMap.forEach(function(value,key){
//打印部门
console.log("部门"+key);
//遍历员工数组 打印员工信息
for(var staff of value){
console.log("姓名:"+staff.name + " 入职时间:"+staff.time);
}
});
}
}
其中重点要复习的知识点 map数据结构
Map数据结构(ES6提供)。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
- Map的创建与基本存取
- Map创建也是使用Map构造函数
- 向Map存储键值对使用set(key, value);方法
- 可以使用get(key),来获取指定key对应的value 值不存在默认为 undefined
var map = new Map();
map.set("a", "lisi");
console.log(map.get('a'));
- Map与Set类似的三种方法
- has(key) 判断给定的 key 是否在 map 中存在
- delete(key) 移除 map 中的 key 及对应的值
- clear() 移除 map 中所有的键值对
- Map初始化
创建Map的时候也可以像Set一样传入数组。但是传入的数组中必须有两个元素,这个两个元素分别是一个数组。
var map = new Map([
//每一个数组中,第一个是是map的可以,第二个是map的value。
//如果只有第一个,则值是undefined
["name", "lisi"],
["age", 20],
["sex", "nan"]
]);
- Map的forEach()方法
<script type="text/javascript">
var map = new Map([
["name", "李四"],
["age", 20],
["sex", "nan"]
]);
/*
回调函数有参数:
参数1:键值对的value
参数2:键值对的key
参数3:map对象本身
*/
map.forEach(function (value, key, ownMap) {
console.log(`key=${key} ,vlue=${value}`);
console.log(this);
})
</script>
弄懂了Map数据结构后,题目就已经解决了一半。然后根据类的创建方法解决问题!-> ;)