>[success] # JS 字典
~~~
1.字典是一種[鍵,值]對的形式來存儲數據結構,這么感覺和js 對象沒有太大的區別
,但實際區別字典的建也是可以為對象,就類似js 中的Map 一樣
~~~
>[danger] ##### 案例看一下js對象和Map最大的區別
~~~
const obj = {}
const keyA = {'a':1}
const keyB ={'b':1}
obj[keyA] = 2
obj[keyB] = 3
console.log(obj[keyA]) // 3 因為對象的key 都是toString 類型
const map = new Map()
map.set(keyA,2)
map.set(keyB,3)
console.log(map.get(keyA)) // 2
~~~
>[info] ## 自己實現一個字典
~~~
1.字典和Map很像,都是可以存儲鍵值對的形式,實現一個dic 字典類
~~~
>[danger] ##### 實現字典的方法
~~~
1.set(key,value):向字典中添加新元素。如果 key 已經存在,那么已存在的 value 會
被新的值覆蓋。
2.remove(key):通過使用鍵值作為參數來從字典中移除鍵值對應的數據值。
3.hasKey(key):如果某個鍵值存在于該字典中,返回 true,否則返回 false。
4.get(key):通過以鍵值作為參數查找特定的數值并返回。
5.clear():刪除該字典中的所有值。
6.size():返回字典所包含值的數量。與數組的 length 屬性類似。
7.isEmpty():在 size 等于零的時候返回 true,否則返回 false。
8.keys():將字典所包含的所有鍵名以數組形式返回。
9.values():將字典所包含的所有數值以數組形式返回。
10.keyValues():將字典中所有[鍵,值]對返回。
11.forEach(callbackFn):迭代字典中所有的鍵值對。callbackFn 有兩個參數:key 和
value。該方法可以在回調函數返回 false 時被中止(和 Array 類中的 every 方法相似)。
~~~
>[danger] ##### 代碼實現
~~~
1.要注意我們實現的字典依然是無法將不同對象根據key 來區分,如果想實際區分需要手動重寫
要作為對象key 的toString 方法
2.存儲的格式'{key:{key:key,value:value}}'
3.defaultToString 方法會專門將key 轉換成字符串的方法
4.ValuePair 專門保存整個key value 形成對象的方法
~~~

~~~
function defaultToString(item) {
if (item === null) {
return 'NULL';
} if (item === undefined) {
return 'UNDEFINED';
} if (typeof item === 'string' || item instanceof String) {
return `${item}`;
}
return item.toString();
}
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 = {};
}
set(key, value) {
if (key != null && value != null) {
const tableKey = this.toStrFn(key);
this.table[tableKey] = new ValuePair(key, value);
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;
}
remove(key) {
if (this.hasKey(key)) {
delete this.table[this.toStrFn(key)];
return true;
}
return false;
}
values() {
return this.keyValues().map(valuePair => valuePair.value);
}
keys() {
return this.keyValues().map(valuePair => valuePair.key);
}
keyValues() {
return Object.values(this.table);
}
forEach(callbackFn) {
const valuePairs = this.keyValues();
for (let i = 0; i < valuePairs.length; i++) {
const result = callbackFn(valuePairs[i].key, valuePairs[i].value);
if (result === false) {
break;
}
}
}
isEmpty() {
return this.size() === 0;
}
size() {
return Object.keys(this.table).length;
}
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;
}
}
~~~
- 接觸數據結構和算法
- 數據結構與算法 -- 大O復雜度表示法
- 數據結構與算法 -- 時間復雜度分析
- 最好、最壞、平均、均攤時間復雜度
- 基礎數據結構和算法
- 線性表和非線性表
- 結構 -- 數組
- JS -- 數組
- 結構 -- 棧
- JS -- 棧
- JS -- 棧有效圓括號
- JS -- 漢諾塔
- 結構 -- 隊列
- JS -- 隊列
- JS -- 雙端隊列
- JS -- 循環隊列
- 結構 -- 鏈表
- JS -- 鏈表
- JS -- 雙向鏈表
- JS -- 循環鏈表
- JS -- 有序鏈表
- 結構 -- JS 字典
- 結構 -- 散列表
- 結構 -- js 散列表
- 結構 -- js分離鏈表
- 結構 -- js開放尋址法
- 結構 -- 遞歸
- 結構 -- js遞歸經典問題
- 結構 -- 樹
- 結構 -- js 二搜索樹
- 結構 -- 紅黑樹
- 結構 -- 堆
- 結構 -- js 堆
- 結構 -- js 堆排序
- 結構 -- 排序
- js -- 冒泡排序
- js -- 選擇排序
- js -- 插入排序
- js -- 歸并排序
- js -- 快速排序
- js -- 計數排序
- js -- 桶排序
- js -- 基數排序
- 結構 -- 算法
- 搜索算法
- 二分搜索
- 內插搜索
- 隨機算法
- 簡單
- 第一題 兩數之和
- 第七題 反轉整數
- 第九題 回文數
- 第十三題 羅馬數字轉整數
- 常見一些需求
- 把原始 list 轉換成樹形結構