内容简介:字典作为最常用的数据结构之一,以键值对的形式存储,最常见的比如像电话簿。字典经常被用来维护某些相对固定的枚举方法或者属性。字典我们本文使用的是数组作为其基本的数据结构支持,没有使用对象,当然数组也是对象,而对象也是按照字典的基本思路设计的。没有使用基本对象作为其数据结构是因为我们某些场景需要对字典进行排序。本文源自《数据结构与算法javascript描述》这本书的字典第七章相关章节。
字典作为最常用的数据结构之一,以键值对的形式存储,最常见的比如像电话簿。字典经常被用来维护某些相对固定的枚举方法或者属性。
字典我们本文使用的是数组作为其基本的数据结构支持,没有使用对象,当然数组也是对象,而对象也是按照字典的基本思路设计的。没有使用基本对象作为其数据结构是因为我们某些场景需要对字典进行排序。
本文源自《数据结构与算法javascript描述》这本书的字典第七章相关章节。
使用场景
对象本身作为字典
在写业务代码的时候,我很多时候看到小伙伴写代码的时候写了过多的具有高度频率重复的一些键值对的对应,或者说if,else的判断。在这种情况下,如果其枚举属性和值比较固定,建议其作为一个枚举字典固定存储和全局使用或者按需使用,这样代码会精简很多。比如:
// old codes let text = ''; if(status === 1){ text = '没有开课'; } else if(status === 2) { text = '上课中' } else { text = '没有这个课程'; } // better codes in status.js or enum.js const statusDict = { 1:'没有开课', 2:'上课中', } const getStatusText = (status) => { const defaultText = '没有这个课程'; if(!status) return defaultText; return statusDict[status] || defaultText; } // 在vue.js 中有过滤器这样的方法, //如果你的应用中高频使用一种过滤器,且针对业务较固定,可以考虑定义为全局过滤器,字典结构维护和使用 复制代码
其他待补充
代码实现
基本定义
因为es6中已经支持了class类,所以我们直接用class语法来实现相关的代码吧,在字典中必有的几个操作,查询,增加,移除,展示。
codepen代码地址:链接
class Dictionary{ constructor(){ this.dataStore = new Array(); this.type = 'Dictionary'; } find(key){ return this.dataScore[key]; } add(key, value){ this.dataStore[key] = value ; } remove(key){ delete this.dataStore[key]; } showAll(){ // 这里说明下 for in拿到的是所有对象属性 包括继承来的,而Object.keys仅仅是自身属性 let keys = Object.keys(this.dataStore); for(var key in keys){ console.log(`${keys[key]}:${this.dataStore[keys[key]]}`); } } } let numbook = new Dictionary(); numbook.add('mike',1314); numbook.add('david',98732); numbook.add('kitty',1314); numbook.remove("mike"); numbook.showAll(); 复制代码
备注:我们在遍历数组内的所有含有值时,需要用for in遍历,不能用普通的for循环,因为对于数组而言,非数字键的不计入其数组元素。而数组本身也是对象,特殊的是其固定的针对数字键的形成指定顺序的显示与返回。
另外我想说明的是,虽然对象本身就支持较好的字典性质的api,但我们为什么还要额外去定义自己的数据结构呢?因为我们很多时候需要的不是基本api,而是基于某些特定场景下对数据的灵活使用和封装。如果我们对业务代码使用时一个基本的对象字典就够了,当然不用额外定义字典类。但是当某些业务场景下需要我们对字典这种基本api使用的条件下,再做一些额外的功能,那肯定还是需要额外定义自己的字典的。
辅助方法
我们需要实现的辅助方法主要有下面几种。
class Dictionary{ // codes xxx // 返回具有的个数 ,为什么不用length,因为数组的lenth仅仅针对数字键 count(){ let n = 0 ; for(let p in Object.keys(this.datastore)){ n++; } return n; } // 清除所有元素 clear(){ for each (let key in Object.keys(this.dataStore)){ delete this.dataStore[key] } } } 复制代码
按照顺序显示,前面讲到我们使用数组,主要是因为有 排序 的需求。那么我们的场景就假设在展示的时候排序即可。
class Dictionary{ // codes xxx // 返回具有的个数 ,为什么不用length,因为数组的lenth仅仅针对数字键 showAllSort(){ let keys = Object.keys(this.dataStore).sort(); for(var key in keys){ console.log(`${keys[key]}:${this.dataStore[keys[key]]}`); } } } 复制代码
练习
使用字典的结构,写一个如下的程序,在一段英文文本内,判断出每个单词出现的个数并最终显示出来。
class WordCountDict{ constructor(text){ this.wordDict = {}; this.text = text; this.init(); } init(){ let wordArr= this.text.split(' '); for(let i=0,len=wordArr.length;i<len;i++){ if(wordArr[i] in this.wordDict){ this.wordDict[wordArr[i]]++; } else { this.wordDict[wordArr[i]] = 1; } } for(let p in this.wordDict){ console.log(`${p}:${this.wordDict[p]}`) } } } let text = 'I am a good student and you are a bad one and so on'; let textDict = new WordCountDict(text); 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Redis 数据结构:字典
- redis 系列6 数据结构之字典(下)
- JS数据结构与算法_集合&字典
- python字典和结构化数据
- 数据结构在实际项目中的使用(三):字典
- Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编程原本
Alexander Stepanov、Paul McJones / 裘宗燕 / 机械工业出版社华章公司 / 2012-1-10 / 59.00元
本书提供了有关编程的一种与众不同的理解。其主旨是,实际的编程也应像其他科学和工程领域一样基于坚实的数学基础。本书展示了在实际编程语言(如C++)中实现的算法如何在最一般的数学背景中操作。例如,如何定义快速求幂算法,使之能使用任何可交换运算。使用抽象算法将能得到更高效、可靠、安全和经济的软件。 这不是一本很容易读的书,它也不是能提升你的编程技能的秘诀和技巧汇编。本书的价值是更根本性的,其终极目......一起来看看 《编程原本》 这本书的介绍吧!