字典
/* 在字典中,存储的是[键,值] 对,其中键名是用来查询特定元素的。字典和集合很相似,集合以[值,值]的形式存储元素,字 典则是以[键,值]的形式来存储元素。字典也称作映射、符号表或关联数组 */ /* set(key,value):向字典中添加新元素。如果 key 已经存在,那么已存在的 value 会 被新的值覆盖。 remove(key):通过使用键值作为参数来从字典中移除键值对应的数据值。 hasKey(key):如果某个键值存在于该字典中,返回 true,否则返回 false。 get(key):通过以键值作为参数查找特定的数值并返回。 clear():删除该字典中的所有值。 size():返回字典所包含值的数量。与数组的 length 属性类似。 isEmpty():在 size 等于零的时候返回 true,否则返回 false。 keys():将字典所包含的所有键名以数组形式返回。 values():将字典所包含的所有数值以数组形式返回。 keyValues():将字典中所有[键,值]对返回。 forEach(callbackFn):迭代字典中所有的键值对。callbackFn 有两个参数:key 和 value。该方法可以在回调函数返回 false 时被中止(和 Array 类中的 every 方法相似)。 */ /* 在字典中,理想的情况是用字符串作为键名,值可以是任何类型(从数、字符串等原始类型, 到复杂的对象) */ function defaultToString(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(); } /* 为了在字典中保存 value,我们将 key 转化为了字符串,而为了保存信息的需要,我们同 样要保存原始的 key。 */ class ValuePair { constructor(key, value) { this.key = key; this.value = value; } toString() { return `${this.key}: ${this.value}` } } // 创建字典 class Dictionary { constructor(toStrFn = defaultToString) { this.toStrFn = toStrFn; this.table = {}; } // 检测一个键是否存在于字典中 /* 如果传入一个复杂对象作为键, 需要将它转化为一个字符串。因此我们需要调用 toStrFn 函数 */ hasKey(key) { return this.table[this.toStrFn(key)] != null; } // 在字典和 ValuePair 类中设置键和值 set(key, value) { if (key != null && value != null) { const tableKey = this.toStrFn(key) this.table[tableKey] = new ValuePair(key, value); return true; } return false; } // 从字典中移除一个值 remove(key) { if(this.hasKey(key)) { delete this.table[this.toStrFn(key)]; return true; } return false; } // 从字典中检索一个值 get(key) { const valuePair = this.table[this.toStrFn(key)]; return valuePair == null ? undefined : valuePair.value; } // 以数组形式返回字典中的所有 valuePair 对象 keyValues() { return Object.values(this.table); } // 可能不是所有浏览器都支持 Object.values 方法,我们也可以用下面的代码来代替 keyValuesTwo() { const valuesPairs = []; for(const k in this.table) { if (this.hasKey(k)) { valuesPairs.push(this.table[k]); } } return valuesPairs; } //返回 Dictionary 类中用于识别值的所有(原始)键名 keys() { return this.keyValues().map(valuePair => valuePair.key); /* 方法二 */ // const keys = []; // const valuePairs = this.keyValues(); // for (let i = 0; i < valuePairs.length; i++) { // keys.push(valuePairs[i].key); // } // return keys; } // 返回的是 value 属性 values() { return this.keyValues().map(valuePair => valuePair.value); } // 用 forEach 迭代字典中的每个键值对 //callback迭代每个 valuePair(行{2})并执行以参数形式传入 forEach 方法的 callbackFn 函数(行{3}),保 // 存它的结果 forEach(callbackFn) { const valuePairs = this.keyValues(); for (let i = 0; i < valuePairs.length; i++) { // {2} const result = callbackFn(valuePairs[i].key, valuePairs[i].value); // {3} if (result === false) { break; } } } // size 方法返回字典中的值的个数 size() { return Object.keys(this.table).length; } // 要检验字典是否为空 isEmpty() { return this.size() === 0; } // 清空字典内容 clear() { this.table = {}; } toString() { if (this.isEmpty()) { return '' } const valuePairs = this.keyValues(); let objString = `${valuePairs[0].toString()}`; for (let i = 1; i < valuePairs.length; i++) { objString = `${objString},${valuePairs[i].toString()}`; } return objString; } } let dictionary = new Dictionary(); dictionary.set(1,'lal') dictionary.set(2,'ddd') dictionary.set('three',3) console.log(dictionary); let key_value = dictionary.keyValues(); console.log(key_value); dictionary.forEach((k, v) => { console.log('forEach:', `key:${k}, value: ${v}`); })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?