js數據結構和算法(4)-字典

4 字典

字典是一種以鍵值對(key-value)存儲數據的數據結構。這個數據結構在js中很是廣泛,好比js中的對象就是這個數據結構,寫過js的人應該對字典很是熟悉。javascript

原書是用數組構建字典的,如今已經8012年了,再用數據一把梭就很low了,這裏咱們使用Map來構造字典這個數據結構。java

4.1 字典的方法和屬性

字典的方法和屬性 含義
size(屬性) 字典的大小
set(方法) 向字典中添加數據
get(方法) 在字典中查找數據
has(方法) 判斷字典中是否有某個數據
delete(方法) 刪除字典中的數據
clear(方法) 清空字典

4.2 字典的程序實現

其實es2015中,字典(map)已經默認存在了,沒有必要再從新實現一遍。我在這裏直接講解下map吧。api

4.2.1 map和對象的區別

在js中map和對象是很是像的,都是採用鍵值對的數據結構。它們不一樣點是它們的key值。對象的key值只容許是字符串,而map的key值能夠是字符串、數字、對象等各類類型。數組

let m = new Map()
const key = {}
const key2 = {}

m.set(key, 'a')
m.set(key2, 'b')
console.log(m.get(key)) // a
console.log(m.get(key2)) // b

let obj = {}
obj[key] = 'a' 
obj[key2] = 'b' 
console.log(obj[key]) // b
console.log(obj[key2]) // b

複製代碼

使用對象存儲數據的時候,對象會默認把key值轉成字符串,key和key2轉成字符串都是[object Object],因此obj[key]和obj[key2]獲取的值是相同的都是b。而map是直接使用對象當作鍵值的,因此mapget(key)和map.get(key2)獲取的是a和b數據結構

4.2.3 map中的屬性和方法

size屬性

size屬性返回Map結構的成員總數ui

let m = new Map()
m.set('a', 'a1')
m.set('b', 'b1')
console.log(m.size) // 2
複製代碼

set(key,value)

set方法設置鍵名key對應的鍵值爲value,而後返回整個map結構,若是key值已經存在,則鍵值會更新spa

let m = new Map()
m.set('a', 'a1')
m.set('a', 'b1')
console.log(m) // Map(1) {"a" => "b1"}
複製代碼

get(key)

獲取key對應的鍵值,若是key不存在,則返回undefinedcode

let m = new Map()
m.set('a', 'a1')
console.log(m.get('b')) // undefined
複製代碼

has(key)

has方法返回一個布爾值,表示某個鍵是否在map對象中對象

let m = new Map()
m.set('a', 'a1')
console.log(m.has('b')) // false
複製代碼

delete(key)

delete方法刪除某個鍵,若是刪除成功則返回true,不然返回falseip

let m = new Map()
m.set('a', 'a1')
m.set('b', 'b1')
console.log(m.delete('b')) // true
console.log(m.delete('c')) // false

複製代碼

clear()

clear方法清空全部的成員,沒有返回值

let m = new Map()
m.set('a', 'a1')
m.set('b', 'b1')
console.log(m) // Map(2) {"a" => "a1", "b" => "b1"}
m.clear()
console.log(m) // Map(0) {}
複製代碼

4.3 對map的遍歷

  • keys() 返回鍵名遍歷器
  • values() 返回鍵值遍歷器
  • entries() 返回全部成員的遍歷器
  • forEach() 遍歷map的全部成員
let map = new Map()
map.set('a', 'a1')
map.set('b', 'b1')
for (let key of map.keys()) {
  console.log(key)
}
// a
// b
for (let value of map.values()) {
  console.log(value)
}
// a1
// b1

for (let [key, value] of map.entries()) {
  console.log(key, value)
}
// a a1
// b b1
map.forEach((value, key) => {
  console.log(value, key)
})
// a1 a
// b1 b
複製代碼

原書是使用數組模擬字典的,多是由於寫該書的時候,es2015還沒出現。es2015中的Map對象就是字典,並且具備良好的api,之後寫代碼能夠省去省去不少麻煩。

相關文章
相關標籤/搜索