Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /