首页 > 编程语言 >TypeScript/Javascript 泛型字典

TypeScript/Javascript 泛型字典

时间:2022-11-26 18:00:11浏览次数:43  
标签:TypeScript return items Javascript param 键值 key 泛型 字典

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)

标签:TypeScript,return,items,Javascript,param,键值,key,泛型,字典
From: https://www.cnblogs.com/commend-sheep/p/16927919.html

相关文章

  • TypeScript学习笔记-05webpack打包
    1.使用命令npminit-y生成项目package.json,这个文件是项目的基本信息,方便我们对项目进行管理,如图所示。2.使用命令 npmi-Dwebpackwebpack-clitypescriptts-load......
  • [Typescript] 118. Hard - IsRequiredKey
    Implementageneric IsRequiredKey<T,K> thatreturnwhether K arerequiredkeysof T .ForexampletypeA=IsRequiredKey<{a:number,b?:string},'a'>......
  • [Typescript] 117. Hard - ClassPublicKeys
    Implementthegeneric ClassPublicKeys<T> whichreturnsallpublickeysofaclass.Forexample:classA{publicstr:stringprotectednum:numberpri......
  • javascript面试题
    1.null和undefined区别首先Undefined和Null都是基本数据类型,这两个基本数据类型分别都只有一个值,就是undefined和null。undefined代表的含义是未定义,null代表......
  • 如何用JavaScripte和HTML 实现一整套的考试答题卡和成绩表
    相信在学校的你都有这样的体验,临近考试,要疯狂的“背诵”否则成绩单就要挂零,因为答题卡全部涂抹都是错的。那么毕业多年的你,没有了考试,有没有一丝怀念涂答题卡的时候,有没有......
  • TypeScript学习笔记-04 tsconfig.json配置文件
    tsconfig.json一般常用的配置如下所示,可以按需要进行配置。{/*tsconfig.json是ts编译器的配置文件,ts编译器可以根据他的信息来对代码进行编译//in......
  • Javascript(笔记52) - promise - 2 API和方法
    Promise 构造函数Promise(excutor){}1)executor 函数:执行器(resolve,reject)=>{}2)resolve 函数:内部定义成功时我们调用的函数value=>{}3)reject函数:内定定义失败时我们......
  • js文件模块化引用问题(JavaScript modules)
    有个前端项目,需要用到配置文件。这个配置文件实在是太大了,就想拆成多个小的,然后一一引入,组合成一个完整的配置文件。如果是vue代码,这种情况根本是手到擒来,不费吹灰之力,而该......
  • JavaScript 读写剪切板
    浏览器环境下,JavaScript读写剪切板读取剪切板varp=navigator.clipboard.readText();p.then(function(clipText){console.log(clipText);//剪贴板内容});......
  • TypeScript编译选项
    编译选项自动编译文件编译文件时,使用-w指令后,TS编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译。但是一次只能编译一个文件。示例:  tsc......