上篇文章介绍了集合的实现,本文介绍字典。字典和集合十分类似,集合中保存的是一系列值,而字典中保存的是键值对。字典也叫映射,在 ES6 中也有原生的支持:Map
。
在上篇集合的实现中,MySet
类实际上也可以看作一个字典类,因为在调用 add()
方法添加元素时,会向 dataStore
属性上添加键和值,因此也可以将其看作一个字典。
采用 JavaScript 对象为基础实现集合主要是基于集合的无序性考虑,数组是有序的,因此不适合用来实现集合。使用 JavaScript 对象实现的 MySet
类,需要保存键值,和字典有点相似。不同点在于,实现 MySet
类时,会在内部隐式的计算出一个键,而在实现字典时,需要显式的指定键,这是它们在实现上的一个区别。
字典的代码实现
下面是字典的代码实现,首先定义 IDict
接口:
interface IDict<T>{
// 添加元素
add(key:string,val:T):void;
// 移除元素
remove(key:string):T;
// 判断是否存在
has(key:string):boolean;
// 根据键获取值
get(key:string):T;
// 清空字典
clear():void;
// 获取字典的长度
size():number;
// 获取所有的键
keys():string[];
// 获取所有的值
values():T[];
}
实现接口,定义 Dict
类:
class Dict<T> implements IDict<T>{
private dataStore:{
[propNames:string]:T
} = {};
private _size:number = 0;
add(key:string,val:T):void{
if(!this.has(key)){
this.dataStore[key] = val;
this._size++;
}
}
remove(key:string):T{
const res:T = this.dataStore[key];
delete this.dataStore[key];
this._size--;
return res;
}
has(key:string):boolean{
return this.dataStore.hasOwnProperty(key);
}
get(key:string):T{
return this.dataStore[key]
}
clear():void{
this.dataStore = {};
}
size():number{
return this._size;
}
keys():string[]{
return Object.keys(this.dataStore);
}
values():T[]{
const tmp:T[] = [];
Object.keys(this.dataStore).forEach(v => {
tmp.push(this.dataStore[v])
})
return tmp;
}
}
完。