typescript是javaScript的超集,相当于把弱类型的js变成了强类型的语言,并且实现了封装(成员私有),更方便面向对象编程。

然鹅,typescript并没有扩增原生JS的内容,比如:支持了import和export,却不会在编译时(正确的)实现,导致运行时报错;无法使用现代市面上高级语言常用的List、Dictionary等。

其实List倒是没必要,js本身就是动态数组;小型项目不必用到import和export,写在一个文件里不影响使用,大项目可以选择导入库。

重点是Dictionary,字典是非常方便管理的数据结构,通过规范使用把对象当字典等手段不是不可取但终究解决不了问题,这种时候不如自己造个轮子,自己实现一个字典出来。

废话了那么多,来看看代码吧:

  1 /**
  2  * 字典,键唯一值不唯一的键值对数据
  3  * @example new Dictionary<number,Object : type>({ 0:type,1:type,... });
  4  * @class Dictionary
  5  * @template K 键的类型,只允许numbr和string
  6  * @template T 值的类型,任意
  7  */
  8 class Dictionary<K extends string | number,T> {
  9     /**
 10      * 字典项目
 11      */
 12     private items : Record<string | number,T> = {};
 13 
 14     /**
 15      * Creates an instance of Dictionary.
 16      * @param {(Record<K,T> | undefined | null)} initvalue 可选的初始化,传入符合K:T类型键值对的对象可以给字典赋予初值
 17      * @example 
 18      * @memberOf Dictionary
 19      */
 20     constructor(initvalue : Record<K,T> | undefined | null = null){
 21         if(initvalue)   this.items = initvalue;
 22     }
 23 
 24     //#region 成员函数
 25     /**
 26      * 验证指定键是否在字典中
 27      * @param key 键
 28      * @returns 是否存在
 29      */
 30     public Contains(key: K | undefined): boolean {
 31       if(key == undefined || key == null) { console.warn("尝试在字典",this,"中查找undefined"); return false;}
 32       return key in this.items
 33     }
 34 
 35     /**
 36      * 设置或添加键值,Set与Add作用相同
 37      * @param key 键
 38      * @param value 值
 39      */
 40     public Set(key: K, value: T): void {
 41       if(!this.Contains(key))
 42         this.items[key] = value
 43       else 
 44         console.warn("尝试往字典",this,"里添加重复的键值");
 45     }
 46     /**
 47      * 设置或添加键值,与Set相同
 48      * @param key 键
 49      * @param value 值
 50      */
 51     public Add = this.Set;
 52 
 53     /**
 54      * 移除指定键
 55      * @param key 键
 56      * @returns 是否移除成功
 57      */
 58     public Remove(key: K | undefined): boolean {
 59       if (this.Contains(key)) {
 60         delete this.items[key as K]
 61         return true
 62       }
 63       console.warn("尝试从字典",this,"移除不存在的键值,或传入undefined")
 64       return false
 65     }
 66 
 67     /**
 68      * 查找特定键的值,没有会返回underfined
 69      * @param key 键
 70      * @returns 值
 71      */
 72     public Get(key: K | undefined): T | undefined {
 73       return this.Contains(key) ? this.items[key as K] : undefined
 74     }
 75 
 76     /**
 77      * 通过值查找键
 78      * @param {T} value 值
 79      * @returns {K} 返回找到的第一个键,若没找到返回-1
 80      * @memberOf Dictionary
 81      */
 82     public Indexof(value : T) : K{
 83         for (const key in this.items) {
 84             if(this.items[key] == value){
 85                 return key as K;
 86             }
 87         }
 88         return -1 as K;
 89     }
 90 
 91     /**
 92      * 获取字典所有的键
 93      * @returns 键数组
 94      */
 95     public Keys(): Array<K> {
 96       let values = new Array<K>()//存到数组中返回
 97       for (let k in this.items) {
 98         if (this.Contains(k as K)) {
 99           values.push(k as K)
100         }
101       }
102       return values
103     }
104 
105     /**
106      * 获取字典所有的值
107      * @returns 值数组
108      */
109     public Values(): Array<T> {
110       // 存到数组中返回
111       let values = new Array<T>()
112       for (let k in this.items) {
113         if (this.Contains(k as K)) {
114           values.push(this.items[k])
115         }
116       }
117       return values
118     }
119 
120     /**
121      * 获取所有键值,注意!返回的对象是副本
122      * @returns 键值对对象
123      */
124     public GetItems(): object {
125       return Object.assign(this.items);
126     }
127 
128     /**
129      * 清空字典
130      */
131     public Clear(): void {
132       this.items = {}
133     }
134 
135     /**
136      * 获取字典大小
137      * @returns 
138      */
139     public Size(): number {
140       return Object.keys(this.items).length
141     }
142     //#endregion
143 }

这是用typescript编写的泛型字典,使用时就像其他高级语言一样 new Dictionary<键类型,值类型>(初始化内容);

考虑到大部分人使用的javascript,这里也提供一份ts编译出的js版本


  1 "use strict";
  2 /**
  3  * 字典,键唯一值不唯一的键值对数据
  4  * @example new Dictionary<number,Object : type>({ 0:type,1:type,... });
  5  * @class Dictionary
  6  * @template K 键的类型,只允许numbr和string
  7  * @template T 值的类型,任意
  8  */
  9 class Dictionary {
 10     /**
 11      * Creates an instance of Dictionary.
 12      * @param {(Record<K,T> | undefined | null)} initvalue 可选的初始化,传入符合K:T类型键值对的对象可以给字典赋予初值
 13      * @example
 14      * @memberOf Dictionary
 15      */
 16     constructor(initvalue = null) {
 17         /**
 18          * 字典项目
 19          */
 20         this.items = {};
 21         /**
 22          * 设置或添加键值,与Set相同
 23          * @param key 键
 24          * @param value 值
 25          */
 26         this.Add = this.Set;
 27         if (initvalue)
 28             this.items = initvalue;
 29     }
 30     //#region 成员函数
 31     /**
 32      * 验证指定键是否在字典中
 33      * @param key 键
 34      * @returns 是否存在
 35      */
 36     Contains(key) {
 37         if (key == undefined || key == null) {
 38             console.warn("尝试在字典", this, "中查找undefined");
 39             return false;
 40         }
 41         return key in this.items;
 42     }
 43     /**
 44      * 设置或添加键值,Set与Add作用相同
 45      * @param key 键
 46      * @param value 值
 47      */
 48     Set(key, value) {
 49         if (!this.Contains(key))
 50             this.items[key] = value;
 51         else
 52             console.warn("尝试往字典", this, "里添加重复的键值");
 53     }
 54     /**
 55      * 移除指定键
 56      * @param key 键
 57      * @returns 是否移除成功
 58      */
 59     Remove(key) {
 60         if (this.Contains(key)) {
 61             delete this.items[key];
 62             return true;
 63         }
 64         console.warn("尝试从字典", this, "移除不存在的键值,或传入undefined");
 65         return false;
 66     }
 67     /**
 68      * 查找特定键的值,没有会返回underfined
 69      * @param key 键
 70      * @returns 值
 71      */
 72     Get(key) {
 73         return this.Contains(key) ? this.items[key] : undefined;
 74     }
 75     /**
 76      * 通过值查找键
 77      * @param {T} value 值
 78      * @returns {K} 返回找到的第一个键,若没找到返回-1
 79      * @memberOf Dictionary
 80      */
 81     Indexof(value) {
 82         for (const key in this.items) {
 83             if (this.items[key] == value) {
 84                 return key;
 85             }
 86         }
 87         return -1;
 88     }
 89     /**
 90      * 获取字典所有的键
 91      * @returns 键数组
 92      */
 93     Keys() {
 94         let values = new Array(); //存到数组中返回
 95         for (let k in this.items) {
 96             if (this.Contains(k)) {
 97                 values.push(k);
 98             }
 99         }
100         return values;
101     }
102     /**
103      * 获取字典所有的值
104      * @returns 值数组
105      */
106     Values() {
107         // 存到数组中返回
108         let values = new Array();
109         for (let k in this.items) {
110             if (this.Contains(k)) {
111                 values.push(this.items[k]);
112             }
113         }
114         return values;
115     }
116     /**
117      * 获取所有键值,注意!返回的对象是副本
118      * @returns 键值对对象
119      */
120     GetItems() {
121         return Object.assign(this.items);
122     }
123     /**
124      * 清空字典
125      */
126     Clear() {
127         this.items = {};
128     }
129     /**
130      * 获取字典大小
131      * @returns
132      */
133     Size() {
134         return Object.keys(this.items).length;
135     }
136 }

Dictionary(js ver)

就是这样,大家也可以参考我的代码,节省自己造轮子的功夫。

(该字典有参考https://www.cnblogs.com/jardeng/p/14849558.html)

原文地址:http://www.cnblogs.com/commend-sheep/p/16927919.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性