字典 和 散列表也和集合一样,都是用来存储唯一值(不重复的值)的数据结构。
集合中,我们看中的是每个值本身,并把值当作主要元素。在字典(或映射)中,我们用【键,值】对的形式来存储数据,散列表也是一样的。但是字典和散列表这俩种数据结构的实现方式略有不同。eg:字典的每个键只能有一个值。
我们已经学习过集合,了解到集合表示一组互不相同的元素(不重复的元素)。字典中,存储的是【键,值】对,其中呢,键名是用来查询特定元素的。字典和集合相似,集合以【值,值】的形式存储元素,字典则以【键,值】的形式存储元素。字典另外的名字也称作映射、符号或关联数组。
计算机科学中,字典经常用来保存对象的引用地址。
接下来我们来创建字典类,同样,es6中也存在一个Map类的实现,类似于我们说的字典。
class Dictionary{
constructor() {
this.table = {}
}
}
与Set类相似,我们将在一个object的实例而不是数组中存储字典中的元素。我们会将【键,值】对保存为table[key] = {key,value}
字典中,理想情况是用字典作为键名,值可以是任何类型(从数、字符串等原始类型,到复杂对象)。我们把所有作为键名传入的对象转化为字符串,使得从Dictionary类中搜索或获取值更简单
function ToString(item) {
if(item === null){
return 'NULL'
} else if (item === undefined) {
return 'UNDEFINED'
}else if (typeof item === 'string' || item instanceof String) {
return `${item}`;
}
return item.toString();
}
然后我们需要声明一些字典所能使用的方法:
- set(key,value):向字典追加新元素。key存在,value会被新值覆盖。如果只传一个参数,value值为undefined
- remove(key): 通过使用键值作为参数来从字典中移除键值对应的数据值
- hasKey(key):如果某个键值存在于该字典中,返回 true,否则返回 false
- get(key): 通过键值作为参数查找特定的数值并返回
- clear():删除该字典中的所有的值
- size(): 返回字典所包含值的数量
- isEmpty():字典内是否有元素,没有时返true,有则返回false
- keys():将字典所包含的所有键名以数组形式返回
- values:将字典中所包含的所有数值以数组形式返回
- keyValues():将字典中所有【键、值】对返回
- forEach(callbackFn):迭代字典中所有的键值对
检测一个键是否存在于字典中
我们首先来实现hasKey(key)方法。之所以要实现这个方法,是因为它会被set和remove等其他方法调用。
hasKey(key) {
return Object.keys(this.table).includes(ToString.call(this,key))
}
接下来来实现set方法,往字典中添加元素
set(key,value){
const argu = [...arguments]
if(argu.length==0){
this.table[undefined] = {undefined:undefined}
} else if(argu.length == 1){
let obj = {}
obj[ToString.call(this,key)] = undefined
this.table[ToString.call(this,key)] = obj
} else {
let obj = {}
obj[ToString.call(this,key)] = value
this.table[ToString.call(this,key)] = obj
}
return this.table
}
现在来实现remove(key)方法,删除指定键值对应的数据值
removeKey(key){
if(this.hasKey(ToString.call(this,key))){
delete this.table[ToString.call(this,key)]
return true
}
return false
}
get(key)我们通过键值来检索一个值并把值返回
get(key){
if(this.hasKey(ToString.call(this,key))) {
return this.table[ToString.call(this,key)]
}
return undefined
}
clear方法删除字典中所有的值
clear() {
this.table = {}
}
size方法返回字典中的所包含值的数量
size() {
return Object.keys(this.table).length
}
isEmpty()判断字典是否为空
isEmpty(){
return this.size() == 0
}
values() 返回所有value组成的数组
values(){
return Object.values(this.table)
}
keyValue()获取字典的键值对
keyValue(){
const valuePairs = []
for (const k in this.table) {
let obj = {}
obj[ToString.call(this,k)] = this.table[ToString.call(this,k)]
valuePairs.push(obj)
}
return valuePairs
}
keys()获取字典的key值组成的数组
keys(){
return Object.keys(this.table)
}
forEach()遍历字典内元素
forEach(callbackFn){
if(!this.isEmpty()){
Object.keys(this.table).forEach((item,index)=>{
callbackFn(item,index,this.table)
})
}
}
接下来,我们使用Dictionary类。首先,我们先创建一个Dictionary的实例,然后为它添加三条电子邮件地址。