Skip to content

Commit 69d263e

Browse files
committed
增加字典的封装和文档
1 parent 434acc6 commit 69d263e

File tree

4 files changed

+200
-0
lines changed

4 files changed

+200
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- [JavaScript 数据结构与算法(六)单向链表](assets/doc/06_JavaScript数据结构与算法(六)单向链表.md)
1919
- [JavaScript 数据结构与算法(七)双向链表](assets/doc/07_JavaScript数据结构与算法(七)双向链表.md)
2020
- [JavaScript 数据结构与算法(八)集合](assets/doc/08_JavaScript数据结构与算法(八)集合.md)
21+
- [JavaScript 数据结构与算法(九)字典](assets/doc/09_JavaScript数据结构与算法(九)字典.md)
2122

2223
## 测试环境
2324

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# JavaScript 数据结构与算法(八)字典
2+
3+
## 字典
4+
5+
### 字典特点
6+
7+
- 字典存储的是**键值对**,主要特点是**一一对应**
8+
- 比如保存一个人的信息
9+
- 数组形式:`[19,‘Tom’,1.65]`,可通过下标值取出信息。
10+
- 字典形式:`{"age":19,"name":"Tom","height":165}`,可以通过 `key` 取出 `value`
11+
- 此外,在字典中 key 是不能重复且无序的,而 Value 可以重复。
12+
13+
### 字典和映射的关系
14+
15+
- 有些编程语言中称这种映射关系为**字典**,如 Swift 中的 Dictonary,Python 中的 dict。
16+
- 有些编程语言中称这种映射关系为 **Map**,比如 Java 中的 HashMap 和 TreeMap 等。
17+
18+
### 字典常见的操作
19+
20+
- `set(key,value)` 向字典中添加新元素。
21+
- `remove(key)` 通过使用键值来从字典中移除键值对应的数据值。
22+
- `has(key)` 如果某个键值存在于这个字典中,则返回 `true`,反之则返回 `false`
23+
- `get(key)` 通过键值查找特定的数值并返回。
24+
- `clear()` 将这个字典中的所有元素全部删除。
25+
- `size()` 返回字典所包含元素的数量。与数组的 `length` 属性类似。
26+
- `keys()` 将字典所包含的所有键名以数组形式返回。
27+
- `values()` 将字典所包含的所有数值以数组形式返回。
28+
29+
### 字典封装
30+
31+
#### 代码实现
32+
33+
```js
34+
// 字典结构的封装
35+
export default class Map {
36+
constructor() {
37+
this.items = {};
38+
}
39+
40+
// has(key) 判断字典中是否存在某个 key
41+
has(key) {
42+
return this.items.hasOwnProperty(key);
43+
}
44+
45+
// set(key, value) 在字典中添加键值对
46+
set(key, value) {
47+
this.items[key] = value;
48+
}
49+
50+
// remove(key) 在字典中删除指定的 key
51+
remove(key) {
52+
// 如果集合不存在该 key,返回 false
53+
if (!this.has(key)) return false;
54+
delete this.items[key];
55+
}
56+
57+
// get(key) 获取指定 key 的 value,如果没有,返回 undefined
58+
get(key) {
59+
return this.has(key) ? this.items[key] : undefined;
60+
}
61+
62+
// 获取所有的 key
63+
keys() {
64+
return Object.keys(this.items);
65+
}
66+
67+
// 获取所有的 value
68+
values() {
69+
return Object.values(this.items);
70+
}
71+
72+
// size() 获取字典中的键值对个数
73+
size() {
74+
return this.keys().length;
75+
}
76+
77+
// clear() 清空字典中所有的键值对
78+
clear() {
79+
this.items = {};
80+
}
81+
}
82+
```
83+
84+
#### 代码测试
85+
86+
```js
87+
const map = new Map();
88+
89+
// set() 测试
90+
map.set("name", "XPoet");
91+
map.set("age", 18);
92+
map.set("email", "i@xpoet.cn");
93+
console.log(map); // {items: {name: "XPoet", age: 18, email: "i@xpoet.cn"}}
94+
95+
// has() 测试
96+
console.log(map.has("name")); //--> true
97+
console.log(map.has("address")); //--> false
98+
99+
// remove() 测试
100+
map.remove("name");
101+
console.log(map); // {age: 18, email: "i@xpoet.cn"}
102+
103+
// get() 测试
104+
console.log(map.get("age")); //--> 18
105+
106+
// keys() 测试
107+
console.log(map.keys()); //--> ["age", "email"]
108+
109+
// values() 测试
110+
console.log(map.values()); //--> [18, "i@xpoet.cn"]
111+
112+
// size() 测试
113+
console.log(map.size()); //--> 2
114+
```

src/Map/index.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import Map from './map';
2+
3+
// ---------------- 封装的字典结构测试 ---------------- //
4+
console.log('// ----- 字典结构测试 START -----//');
5+
const map = new Map();
6+
7+
// set() 测试
8+
map.set('name', 'XPoet');
9+
map.set('age', 18);
10+
map.set('email', 'i@xpoet.cn');
11+
console.log(map); // {items: {name: "XPoet", age: 18, email: "i@xpoet.cn"}}
12+
13+
// has() 测试
14+
console.log(map.has('name')); //--> true
15+
console.log(map.has('address')); //--> false
16+
17+
// remove() 测试
18+
map.remove('name');
19+
console.log(map); // {age: 18, email: "i@xpoet.cn"}
20+
21+
// get() 测试
22+
console.log(map.get('age')); //--> 18
23+
24+
// keys() 测试
25+
console.log(map.keys()); //--> ["age", "email"]
26+
27+
// values() 测试
28+
console.log(map.values()); //--> [18, "i@xpoet.cn"]
29+
30+
// size() 测试
31+
console.log(map.size()); //--> 2
32+
33+
console.log('// ----- 字典结构测试 END -----//');
34+
35+

src/Map/map.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// 字典结构的封装
2+
export default class Map {
3+
4+
constructor() {
5+
this.items = {};
6+
}
7+
8+
// has(key) 判断字典中是否存在某个 key
9+
has(key) {
10+
return this.items.hasOwnProperty(key);
11+
}
12+
13+
// set(key, value) 在字典中添加键值对
14+
set(key, value) {
15+
this.items[key] = value;
16+
}
17+
18+
// remove(key) 在字典中删除指定的 key
19+
remove(key) {
20+
// 如果集合不存在该 key,返回 false
21+
if (!this.has(key)) return false;
22+
delete this.items[key];
23+
}
24+
25+
// get(key) 获取指定 key 的 value,如果没有,返回 undefined
26+
get(key) {
27+
return this.has(key) ? this.items[key] : undefined;
28+
}
29+
30+
// 获取所有的 key
31+
keys() {
32+
return Object.keys(this.items);
33+
}
34+
35+
// 获取所有的 value
36+
values() {
37+
return Object.values(this.items);
38+
}
39+
40+
// size() 获取字典中的键值对个数
41+
size() {
42+
return this.keys().length;
43+
}
44+
45+
// clear() 清空字典中所有的键值对
46+
clear() {
47+
this.items = {};
48+
}
49+
50+
}

0 commit comments

Comments
 (0)