Iwen's blog Iwen's blog
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于

Iwen

不摸鱼的哥哥
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于
  • Vue

  • Vue进阶

  • CSS

  • ES6

  • Base

  • Core

  • Array

  • Object

  • String

  • Async

  • Browser

  • Http

  • 性能优化

  • 正则

  • 经典总结

  • 设计模式

  • 数据结构

    • 栈
    • 队列
    • 链表
    • 树
    • 集合
    • 字典
      • 实现
    • 图
    • 散列表
    • 堆
  • 算法

  • 手写

  • TypeScript

  • 复盘
  • 数据结构
Mr.w
2020-11-29

字典

# 字典(Dictionary)

类似于集合, 字典也是一种无重复元素, 无顺序的数据结构。

区别在于在集合中, 我们以 [值, 值] 的形式存储; 在字典中, 我们以 [键, 值] 的形式存储;

ES6 引入的 Map 就是字典的数据类型。

方法 描述
set 添加新元素, 如果存在则覆盖值
remove 移除键值
hasKey 键值是否存在 (Boolean)
get 获取指定键值
clear 清除字典
size 返回字典数量
isEmpty 字典数量是否为空 (Boolean)
keys 返回所有键名 (Array)
values 返回所有键值 (Array)
keyValues 将字典所有[键, 值]对返回 (Array)
forEach 迭代字典中所有的键值对 call(key, value)

# 实现

class ValuePair {
    constructor(key, value) {
        this.key = key
        this.value = value
    }
    toString() {
        return `[${this.key}: ${this.key}]`
    }
}
class Dictionary {
    constructor() {
        this.toStrFn = function(item) {
            if (item === null) {
                return 'NULL'
            } else if (item === undefined) {
                return 'UNDEFINED'
            } else if (typeof item === 'string' || item instanceof String) {
                return `${item}`                
            } else {
                item.toString()
            }
        }
        this.table = {}
    }

    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
    }

    hasKey(key) {
        return this.table[this.toStrFn(key)] != null
    }

    keyValues() {
        const valuePair = []
        for (let k in this.table) {
            if (this.hasKey(k)) {
                valuePair.push(this.table[k])
            }
        }
        return valuePair
    }

    keys() {
        const keys = []
        const valuePairs = this.keyValues()
        for (let i = 0; i < valuePairs.length; i++) {
            keys.push(valuePairs[i].key)
        }
        return keys
    }

    values() {
        const values = []
        const valuePairs = this.keyValues()
        for (let i = 0; i < valuePairs.length; i++) {
            values.push(valuePairs[i].value)
        }
        return values
    }

    size() {
        return this.keys().length
    }

    isEmpty() {
        return this.size() === 0
    }

    clear() {
        this.table = {}
    }    

    forEach(callFn) {
        const valuePairs = this.keyValues()
        for (let i = 0; i < valuePairs.length; i++) {
            const key = valuePairs[i].key,
                  value = valuePairs[i].value,
                  result = callFn(key, value);
            // 如果回调函数返回false 则中断forEach方法的执行
            if (result === false) {
                break;
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
集合
图

← 集合 图→

最近更新
01
flex布局页面自适应滚动条问题
12-28
02
前后端分离开发请求接口跨域如何携带cookie的问题
12-28
03
怎么实现div长宽比固定width-height4比3
12-28
更多文章>
Theme by Vdoing | Copyright © 2017-2022 Iwen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式