文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript数据结构之字典方法怎么用

2023-06-30 08:44

关注

今天小编给大家分享一下JavaScript数据结构之字典方法怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、什么是字典

上面说了,集合中是通过元素的值来决定元素的唯一性。然而在字典中,存储的方式是键值对,也就是 key->value 的形式,字典只要求 key 必须唯一,value 则没有限制。

这里 key 的作用是唯一标识,用来查询对应的 value 值。也就是说可以通过唯一的 key 映射到对应的 value。所以字典也称作映射符号表关联数组

在计算机世界中,字典经常用来标识对象的引用地址。比如在 JavaScript 当中的引用类型数据,变量名会指向数据的引用,这是一对映射关系。变量名不能重复,但是不同的变量名可以指向同一块引用。

与 Set 类似,JavaScript ES6 中同样包含了一个 Map 类,既我们所说的字典。

二、创建字典类

下面我们参照 ES6 Map 类的实现,自己动手实现一个 Dictionary 类。

class Dictionary {  constructor() {    this.table = {}  }}

与前面的其他数据结构实现类似,我们在一个对象 table 中存储所有字典的元素。我们的保存形式为:table[key] = {key, value}

在字典中,通常是用字符串作为键名(key),数据值可以是任意类型。但是 JavaScript 并不是强类型的语言,无法保证传入的键名一定是字符串。所以我们需要将键名做一次字符串的转化。

写一个默认的转换字符串函数:

function keyToString(item) {  if(typeof item === null) {    return 'NULL'  }  if(typeof item === undefined) {    return 'UNDEFINED'  }  if(item instanceof String) {    return `${item}`  }  return item.toString()}

除此之外,我们还有必要将键值对的数据格式封装成一个单独的类。因为我们的 key 是不固定的,然而在后面的方法中要频繁使用 key,此时你不知道键名具体是什么。所以要封装一个 ValuePair 类,定义如下:

class ValuePair {  constructor(key, value) {    this.key = key;    this.value = value;  }}

接下来在类中声明一些必要的方法如下:

1.hasKey 方法

该方法的作用是检测一个键是否在字典中。因为这个方法会在添加和删除元素时使用,所以先实现:

hasKey(key) {  return this.table[keyToString(key)] != null}

首先对传入的键进行字符串转换,然后判断键值是不是 null 或者 undefined

2.set 方法

set 方法用来在字典中添加键值对:

set(key, value) {  if(key != null && value != null) {    let table_key = keyToString(key)    this.table[table_key] = new ValuePair(key, value)    return true  }  return false}

3.remove 方法

remove 方法用来在字典中删除一个键值对:

remove(key) {  if(this.hasKey(key)) {    delete this.table[keyToString(key)]    return true  }  return false}

4.get 方法

get 方法用来获取键名对应的键值:

get(key) {  if(this.hasKey(key)) {    let table_key = keyToString(key)    return this.table[table_key].value  }  return undefined}

5.keys, values, keyValues 方法

这三个是比较简单的辅助函数,一起介绍:

keyValues() {  return Object.values(this.table)}keys() {  return this.keyValues().map(valuePair=> valuePair.key)}values() {  return this.keyValues().map(valuePair=> valuePair.value)}

首先 keyValues 方法会以数组的形式返回字典的所有键值,返回结果是一个 ValuePair 实例的数组。然后在这个函数的基础上,再分别获取对应的 key 数组和 value 数组。

6.forEach 方法

forEach 方法与数组的 forEach 方法功能一致,就是迭代所有元素,我们看一下迭代字典的所有值怎么实现:

forEach(callFn) {  let valuePairs = this.keyValues()  for(let i = 0; i < valuePairs.length; i++) {    let result = callFn(valuePairs[i].key, valuePairs[i].value)    if(result === false) break;  }}

首先传一个回调函数作为参数,然后遍历字典的长度,并在循环里调用这个回调函数。这里我们的一个设计是,如果在回调函数内返回 false,则会中断循环。

7.clear, size, isEmpty 方法

这个三个方法也比较基础:

size() {  return Object.keys(this.table).length;}isEmpty() {  return this.size() === 0}clear() {  this.table = {}}

三、使用字典

前面我们写了不少方法实现了一个字典类,现在来使用一下:

var dict = new Dictionary();dict.set("name", "赛罗");dict.set("color", "红蓝");dict.set("skill", "头标");

添加了三个键值对,我们看一下基本方法的返回结果:

console.log(dict.keys()); // ['name', 'color', 'skill']console.log(dict.values()); // ['赛罗', '红蓝', '头标']console.log(dict.size()); // 3console.log(dict.hasKey("color")); // trueconsole.log(dict.get("color")); // 红蓝console.log(dict.hasKey("like")); // falseconsole.log(dict.get("like")); // undefined

看结果都没问题,再来一波遍历:

dict.forEach((key, value) => {  console.log(key, value);  if (key === "color") return false;});// 打印结果:// name 赛罗// color 红蓝

可见循环遍历是没有问题的,而且当函数执行返回 false 时,则会终止遍历,因此第三个键值对没有打印出来,结果达标。

最后再看一下删除:

// 删除键值对console.log(dict.remove("color")); // trueconsole.log(dict.remove("like")); // falseconsole.log(dict.remove("skill")); // trueconsole.log(dict.keyValues());  // [ValuePair]console.log(dict.hasKey("color")); falseconsole.log(dict.size()); 1// 清空字典dict.clear();console.log(dict.keyValues()); // []console.log(dict.isEmpty()); // true

以上就是“JavaScript数据结构之字典方法怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯