列表形式输出字典的键与值_数据结构之·字典&散列表

字典 散列表也和集合一样,都是用来存储唯一值(不重复的值)的数据结构。

集合中,我们看中的是每个值本身,并把值当作主要元素。在字典(或映射)中,我们用【键,值】对的形式来存储数据,散列表也是一样的。但是字典和散列表这俩种数据结构的实现方式略有不同。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();
}

然后我们需要声明一些字典所能使用的方法:

  1. set(key,value):向字典追加新元素。key存在,value会被新值覆盖。如果只传一个参数,value值为undefined
  2. remove(key): 通过使用键值作为参数来从字典中移除键值对应的数据值
  3. hasKey(key):如果某个键值存在于该字典中,返回 true,否则返回 false
  4. get(key): 通过键值作为参数查找特定的数值并返回
  5. clear():删除该字典中的所有的值
  6. size(): 返回字典所包含值的数量
  7. isEmpty():字典内是否有元素,没有时返true,有则返回false
  8. keys():将字典所包含的所有键名以数组形式返回
  9. values:将字典中所包含的所有数值以数组形式返回
  10. keyValues():将字典中所有【键、值】对返回
  11. 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的实例,然后为它添加三条电子邮件地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值