字典,英语为 Dictionary,这是一种存储一组 键值对 的数据结构。在字典中,每个键(key)都是 唯一 的,并且与一个值(value)关联。你可以通过键来访问对应的值,这使得字典特别适用于需要快速查找和插入操作的场景。
字典的基本特征
- 键唯一性
- 键值对
- 无序性
- 快速查找
字典常见方法
set(key, value):向字典添加新的元素。如果 key 已经存在,那么已存在的 value 会被新的值覆盖。remove(key):通过使用键值作为参数来从字典中移除键值对应的数据值。hasKey(key):如果某个键值存在于该字段,返回 true,否则返回 false。get(key):通过以键值作为参数查找特定的数值并返回。clear():删除该字典中的所有值。size():返回字典所包含值的数量,与数组的 length 属性类似。isEmpty():检查字典是否为空,为空返回 true,否则返回 false。keys():将字典所包含的所有键名以数组形式返回。values():将字典所包含的所有值以数组形式返回。keyValues():将字典中所有键值对以数组形式返回。forEach(callbackFn):迭代字典中所有的键值对,callbackFn 接收两个参数,分别为本次迭代的 key 和 value。
在不同的编程语言中,字典的叫法会有一点区别,有的称之为映射(Map)、哈希表(HashMap) 或者关联数组。
代码实现
class MyDictionary { constructor() { this.items = {} } // 向字典中添加新的元素 set(key, value) { this.items[key] = value } // 判断字典中是否存在某个键 hasKey(key) { return Object.prototype.hasOwnProperty.call(this.items, key) } // 根据 key 来获取数据 get(key) { return this.hasKey(key) ? this.items[key] : undefined } // 一些辅助方法 clear() { this.items = {} } size() { return this.keys().length } isEmpty() { return this.size() === 0 } keys() { return Object.keys(this.items) } values() { return Object.values(this.items) } keyValues() { return Object.entries(this.items) } forEach(fn) { for (let key in this.items) { fn(key, this.items[key]) } }}从 ES6 开始,官方就在语言中内置了字典结构(map)
const m = new Map()
m.set('name', 'Tom')m.set('age', 30)m.set('city', 'New York')
console.log(m)
m.delete('city')console.log(m)
console.log(m.size)
m.set('name', '张三')console.log(m)
console.log(m.get('name'))
console.log(m.keys())console.log(m.values())console.log(m.entries())
m.forEach((value, key) => { console.log(key, value)})字典常见操作
-
合并字典:将两个字典合并成一个字典
const m1 = new Map([['a', 1],['b', 2],])const m2 = new Map([['c', 10],['b', 20],])const m3 = new Map([...m1, ...m2])console.log(m3) -
过滤字典:根据某些条件来筛选出某些键值对
const m1 = new Map([ ['a', 1], ['b', 2], ['c', 3], ['d', 4],])const m2 = new Map([...m1].filter(([key, value]) => value >= 3))console.log(m2)- 转换字典键值
const m1 = new Map([ ['a', 1], ['b', 2], ['c', 3], ['d', 4],])const m2 = new Map([...m1].map(([key, value]) => [key, value * 2]))console.log(m2)-EOF-