昨天有一道題完残,用ES6中的類寫一道業(yè)務(wù)編程題览徒。題目大致如下
需求:
員工類(Staff)
屬性:
員工姓名(name)
所在部門名字(departmentName)(是一個字符串)
入職時間(time)(例如:2015 這種格式的字符串即可)
公司類(Company)
屬性:部門:(departmentMap) (類型是一個Map,Map的鍵是部門的名字罚缕,值是對應(yīng)部門的員工數(shù)組,員工數(shù)組里是每個員工對象)
方法:
1浮毯、添加員工
要求:首先員工姓名和入職時間不能同時重復(fù)。 如果添加的員工所在部門不存在泰鸡,你需要幫他
創(chuàng)建該部門债蓝,并且加入到該部門中,如果該部門存在直接加入該部門即可盛龄。
2饰迹、顯示所有員工信息的方法
要求:打印格式為
xxx部門:
姓名:小雪 入職時間:2015
姓名:小剛 入職時間:2016
xxx部門:
姓名:xxx 入職時間:xxx
拿到題目之后 感覺很熟悉也很陌生,因為ES6是新學(xué)的但是也大都忘記了余舶。
得蹦锋,回頭查查資料吧。
通過復(fù)習(xí)資料我們可以知道JS中的類的基本寫法
class Staff{
//構(gòu)造器 直指類本身
constructor(參數(shù)1欧芽,參數(shù)2...){
this.屬性1 = 參數(shù)1;
this.屬性2 = 參數(shù)2;
...
}
//方法
toString(){
//有默認(rèn)方法 可以重寫
}
//...其它方法
}
弄懂了這個,員工類和公司類的結(jié)構(gòu)就很好寫了
//員工類
class Staff{
//構(gòu)造器
constructor(name,departmentName,time){
//屬性
this.name = name;
this.departmentName = departmentName;
this.time = time;
}
}
//公司類結(jié)構(gòu)如下
class Company{
constructor(){
//Map 數(shù)據(jù)結(jié)構(gòu) 參見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;
//首先判斷是否存在部門 如果不存在 直接創(chuàng)建部門 并添加員工到數(shù)組 并打印
if(!this.departmentMap.has(departmentName)){
this.departmentMap.set(departmentName,[staff]);
console.log("success");
}else{
//如果存在部門 現(xiàn)獲取該部門對應(yīng)的員工數(shù)組
var arr = this.departmentMap.get(departmentName);
//遍歷判斷新添加的員工是否已存在(通過flag的增量是否等于員工數(shù)組的長度)
for(var s of arr){
//不存在 flag++
if(!(name==s.name&&time==s.time)){
flag++;
}
}
//如果flag等于員工數(shù)組的長度 說明不存在同時入職同名員工 這時添加 否則打印error
if(flag==arr.length){
arr.push(staff);
console.log("sucess");
}else{
console.log("error");
}
}
}
printStaff(){
//注意參數(shù) 是value在前 key在后 還有一個參數(shù) 我沒用
this.departmentMap.forEach(function(value,key){
//打印部門
console.log("部門"+key);
//遍歷員工數(shù)組 打印員工信息
for(var staff of value){
console.log("姓名:"+staff.name + " 入職時間:"+staff.time);
}
});
}
}
其中重點要復(fù)習(xí)的知識點 map數(shù)據(jù)結(jié)構(gòu)
Map數(shù)據(jù)結(jié)構(gòu)(ES6提供)葛圃。它類似于對象千扔,也是鍵值對的集合憎妙,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當(dāng)作鍵曲楚。
- Map的創(chuàng)建與基本存取
- Map創(chuàng)建也是使用Map構(gòu)造函數(shù)
- 向Map存儲鍵值對使用set(key, value);方法
- 可以使用get(key),來獲取指定key對應(yīng)的value 值不存在默認(rèn)為 undefined
var map = new Map();
map.set("a", "lisi");
console.log(map.get('a'));
- Map與Set類似的三種方法
- has(key) 判斷給定的 key 是否在 map 中存在
- delete(key) 移除 map 中的 key 及對應(yīng)的值
- clear() 移除 map 中所有的鍵值對
- Map初始化
創(chuàng)建Map的時候也可以像Set一樣傳入數(shù)組厘唾。但是傳入的數(shù)組中必須有兩個元素,這個兩個元素分別是一個數(shù)組龙誊。
var map = new Map([
//每一個數(shù)組中抚垃,第一個是是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"]
]);
/*
回調(diào)函數(shù)有參數(shù):
參數(shù)1:鍵值對的value
參數(shù)2:鍵值對的key
參數(shù)3:map對象本身
*/
map.forEach(function (value, key, ownMap) {
console.log(`key=${key} ,vlue=${value}`);
console.log(this);
})
</script>
弄懂了Map數(shù)據(jù)結(jié)構(gòu)后,題目就已經(jīng)解決了一半逊朽。然后根據(jù)類的創(chuàng)建方法解決問題罕伯!-> ;)