Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

字典map

mob60475707384d 2021-09-27 13:58:42 阅读数:31 评论数:0 点赞数:0 收藏数:0


字典


字典和集合很相似,集合以[值,值]的形式存儲元素,字典則是以[鍵,值]的形式來存儲元素


實現Dictionary




function defaultToString(item){
// 將鍵轉化為字符串
if(item === null){
return 'NULL'
}else if(item === undefined){
return 'UNDEFINED'
}else{
return item.toString()
}

}

class valuePair{
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
// 鍵值對
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 = {}
}
hasKey(key){
return this.table[this.toStrFn[key]] !== undefined
}
set(key, val){
// 添加新元素
if(key !== null && val !== null){
const strKey = this.toStrFn(key)
this.table[strKey] = new valuePair(key, val)
return true
}
return false
}
remove(key){
if (this.hasKey(key)) {
delete this.table[this.toStrFn(key)]
return true
}
return false
}
get(key){
const value = this.table[this.toStrFn(key)]
return value === undefined ? null : value.value
}
keyValues(){
// 返回所有鍵值對組成的數組
// Object.values(obj): Returns an array of values of the enumerable properties of an object
return Object.values(this.table)
}
keys(){
// 返回所有鍵組成的數組
return this.keyValues().map((val) => {
return val.key
})
}
values(){
// 返回所有值組成的數組
return this.keyValues().map((val) => {
return val.value
})
}
forEach(callbackFn){
// 傳入一個函數,參數為(key, value),迭代數組中的每個鍵值對運行
const valuePair = this.keyValues()
for(let i=0; i<valuePair.length; i++){
const result = callbackFn(valuePair[i].key, valuePair[i].value)
if (result === false) {
break // 出錯立即停止
}
}
}
size(){
return Object.keys(this.table).length
}
isEmpty(){
return this.size() === 0
}
clear(){
this.table = {}
}
toString(){
if(this.isEmpty()){
return ""
}
const valuePairs = this.keyValues()
let objString = `${valuePairs[0].toString()}`
for(let i=1; i<this.size(); i++){
objString = `${objString},${valuePairs[i].toString()}`
}
return objString
}
}
  • 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.


原生Map類



const map = new Map()
map.set("a","aa")
map.set("b","bb")
map.set("c","cc")

console.log(map.has("b")) // true
console.log(map.size) // 3

// 和我們定義的 Dictionary 類不同,ES2015 的 Map 類的 values 方法和 keys 方法都返回Iterator
console.log(map.keys()) // [Map Iterator] { 'a', 'b', 'c' }
console.log(map.values()) // [Map Iterator] { 'aa', 'bb', 'cc' }

console.log(map.get("c")) // cc
map.delete('c') // 删除
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.



WeakMap 和 WeakSet


除了 Set 和 Map 這兩種新的數據結構,ES2015還增加了它們的弱化版本,WeakSet 和 WeakMap


基本上,Map 和 Set 與其弱化版本之間僅有的區別是:


1. WeakSet 或 WeakMap 類沒有 entries、keys 和 values 等方法


2. 只能用對象作為鍵。


創建和使用這兩個類主要是為了性能。WeakSet 和 WeakMap 是弱化的(用對象作為鍵),沒有强引用的鍵,這使得 JavaScript 的垃圾回收器可以從中清除整個入口。


另一個優點是,必須用鍵才可以取出值,這些類沒有 entries、keys 和 values 等迭代器方法,因此,除非你知道鍵,否則沒有辦法取出值,所以可以使用WeakMap類封裝私有屬性。


// 例:
const weakMap = new WeakMap()
const obj1 = {"name": "1"}
const obj2 = {"name": "2"}
const obj3 = {"name": "3"}

map.set(obj1, "111")
map.set(obj2, "222")
map.set(obj3, "333")

console.log(map.has(obj1)) // true
console.log(map.get(obj3)) // 333
map.delete(obj2) // 删除
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.


版权声明
本文为[mob60475707384d]所创,转载请带上原文链接,感谢

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领