最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript?數(shù)據(jù)結(jié)構(gòu)之字典方法

 更新時(shí)間:2022年04月22日 16:41:42   作者:??楊成功????  
這篇文章主要介紹了JavaScript?數(shù)據(jù)結(jié)構(gòu)之字典方法,字典即Dictionary,是一種以?鍵-值對(duì)?形式存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),下文更多相關(guān)介紹需要的小伙伴可以參考一下

前言:

經(jīng)過上一篇JavaScript 數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(2)的學(xué)習(xí),數(shù)據(jù)結(jié)構(gòu)的集合部分已經(jīng)完結(jié)了。那么下面我們又要認(rèn)識(shí)一個(gè)新的數(shù)據(jù)結(jié)構(gòu),它的名字相信你絕不陌生,它就是字典。

這個(gè)字典可不是查漢字時(shí)用的那個(gè)字典。字典在數(shù)據(jù)結(jié)構(gòu)中也是用來存儲(chǔ)唯一的不重復(fù)的值,這一點(diǎn)倒和集合類似。不過兩者的存儲(chǔ)形式不同。

集合更關(guān)注元素本身,以元素本身的值作為唯一標(biāo)識(shí)。而字典的存儲(chǔ)形式是 鍵值對(duì),這個(gè)我們太熟了。以 key 為標(biāo)識(shí),value 為對(duì)應(yīng)的值,這不就是我們的 JSON 嘛。

下面我們從最基礎(chǔ)開始,學(xué)習(xí)字典。

一、什么是字典

上面說了,集合中是通過元素的值來決定元素的唯一性。然而在字典中,存儲(chǔ)的方式是鍵值對(duì),也就是 key->value 的形式,字典只要求 key 必須唯一,value 則沒有限制。

這里 key 的作用是唯一標(biāo)識(shí),用來查詢對(duì)應(yīng)的 value 值。也就是說可以通過唯一的 key 映射到對(duì)應(yīng)的 value。所以字典也稱作映射,符號(hào)表關(guān)聯(lián)數(shù)組。

在計(jì)算機(jī)世界中,字典經(jīng)常用來標(biāo)識(shí)對(duì)象的引用地址。比如在 JavaScript 當(dāng)中的引用類型數(shù)據(jù),變量名會(huì)指向數(shù)據(jù)的引用,這是一對(duì)映射關(guān)系。變量名不能重復(fù),但是不同的變量名可以指向同一塊引用。

與 Set 類似,JavaScript ES6 中同樣包含了一個(gè) Map 類,既我們所說的字典。

二、創(chuàng)建字典類

下面我們參照 ES6 Map 類的實(shí)現(xiàn),自己動(dòng)手實(shí)現(xiàn)一個(gè) Dictionary 類。

class Dictionary {
  constructor() {
    this.table = {}
  }
}

與前面的其他數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)類似,我們?cè)谝粋€(gè)對(duì)象 table 中存儲(chǔ)所有字典的元素。我們的保存形式為:table[key] = {key, value}。

在字典中,通常是用字符串作為鍵名(key),數(shù)據(jù)值可以是任意類型。但是 JavaScript 并不是強(qiáng)類型的語言,無法保證傳入的鍵名一定是字符串。所以我們需要將鍵名做一次字符串的轉(zhuǎn)化。

寫一個(gè)默認(rèn)的轉(zhuǎn)換字符串函數(shù):

function keyToString(item) {
  if(typeof item === null) {
    return 'NULL'
  }
  if(typeof item === undefined) {
    return 'UNDEFINED'
  }
  if(item instanceof String) {
    return `${item}`
  }
  return item.toString()
}

除此之外,我們還有必要將鍵值對(duì)的數(shù)據(jù)格式封裝成一個(gè)單獨(dú)的類。因?yàn)槲覀兊?key 是不固定的,然而在后面的方法中要頻繁使用 key,此時(shí)你不知道鍵名具體是什么。所以要封裝一個(gè) ValuePair 類,定義如下:

class ValuePair {
  constructor(key, value) {
    this.key = key;
    this.value = value;
  }
}

接下來在類中聲明一些必要的方法如下:

  • set:向字典中添加新元素
  • remove:以鍵名為參數(shù),移除字典中對(duì)應(yīng)的鍵值
  • hasKey:檢測(cè)某個(gè)鍵名是否存在于字典中,存在則返回 true
  • get:用鍵名查找對(duì)應(yīng)的鍵值并返回
  • clear:清空字典
  • size:返回字典所包含鍵的數(shù)量
  • isEmpty:在 size 等于零時(shí)返回 true
  • keys:返回字典中所有鍵名組成的數(shù)組
  • values:返回字典中所有鍵值組成的數(shù)組
  • keyValues:返回所有鍵值對(duì)
  • forEach:迭代所有的鍵值對(duì)

1.hasKey 方法

該方法的作用是檢測(cè)一個(gè)鍵是否在字典中。因?yàn)檫@個(gè)方法會(huì)在添加和刪除元素時(shí)使用,所以先實(shí)現(xiàn):

hasKey(key) {
  return this.table[keyToString(key)] != null
}

首先對(duì)傳入的鍵進(jìn)行字符串轉(zhuǎn)換,然后判斷鍵值是不是 null 或者 undefined

2.set 方法

set 方法用來在字典中添加鍵值對(duì):

set(key, value) {
  if(key != null && value != null) {
    let table_key = keyToString(key)
    this.table[table_key] = new ValuePair(key, value)
    return true
  }
  return false
}

3.remove 方法

remove 方法用來在字典中刪除一個(gè)鍵值對(duì):

remove(key) {
  if(this.hasKey(key)) {
    delete this.table[keyToString(key)]
    return true
  }
  return false
}

4.get 方法

get 方法用來獲取鍵名對(duì)應(yīng)的鍵值:

get(key) {
  if(this.hasKey(key)) {
    let table_key = keyToString(key)
    return this.table[table_key].value
  }
  return undefined
}

5.keys, values, keyValues 方法

這三個(gè)是比較簡(jiǎn)單的輔助函數(shù),一起介紹:

keyValues() {
  return Object.values(this.table)
}
keys() {
  return this.keyValues().map(valuePair=> valuePair.key)
}
values() {
  return this.keyValues().map(valuePair=> valuePair.value)
}

首先 keyValues 方法會(huì)以數(shù)組的形式返回字典的所有鍵值,返回結(jié)果是一個(gè) ValuePair 實(shí)例的數(shù)組。然后在這個(gè)函數(shù)的基礎(chǔ)上,再分別獲取對(duì)應(yīng)的 key 數(shù)組和 value 數(shù)組。

6.forEach 方法

forEach 方法與數(shù)組的 forEach 方法功能一致,就是迭代所有元素,我們看一下迭代字典的所有值怎么實(shí)現(xiàn):

forEach(callFn) {
  let valuePairs = this.keyValues()
  for(let i = 0; i < valuePairs.length; i++) {
    let result = callFn(valuePairs[i].key, valuePairs[i].value)
    if(result === false) break;
  }
}

首先傳一個(gè)回調(diào)函數(shù)作為參數(shù),然后遍歷字典的長(zhǎng)度,并在循環(huán)里調(diào)用這個(gè)回調(diào)函數(shù)。這里我們的一個(gè)設(shè)計(jì)是,如果在回調(diào)函數(shù)內(nèi)返回 false,則會(huì)中斷循環(huán)。

7.clear, size, isEmpty 方法

這個(gè)三個(gè)方法也比較基礎(chǔ):

size() {
  return Object.keys(this.table).length;
}
isEmpty() {
  return this.size() === 0
}
clear() {
  this.table = {}
}

三、使用字典

前面我們寫了不少方法實(shí)現(xiàn)了一個(gè)字典類,現(xiàn)在來使用一下:

var dict = new Dictionary();
dict.set("name", "賽羅");
dict.set("color", "紅藍(lán)");
dict.set("skill", "頭標(biāo)");

添加了三個(gè)鍵值對(duì),我們看一下基本方法的返回結(jié)果:

console.log(dict.keys()); // ['name', 'color', 'skill']
console.log(dict.values()); // ['賽羅', '紅藍(lán)', '頭標(biāo)']
console.log(dict.size()); // 3
console.log(dict.hasKey("color")); // true
console.log(dict.get("color")); // 紅藍(lán)
console.log(dict.hasKey("like")); // false
console.log(dict.get("like")); // undefined

看結(jié)果都沒問題,再來一波遍歷:

dict.forEach((key, value) => {
  console.log(key, value);
  if (key === "color") return false;
});
// 打印結(jié)果:
// name 賽羅
// color 紅藍(lán)

可見循環(huán)遍歷是沒有問題的,而且當(dāng)函數(shù)執(zhí)行返回 false 時(shí),則會(huì)終止遍歷,因此第三個(gè)鍵值對(duì)沒有打印出來,結(jié)果達(dá)標(biāo)。

最后再看一下刪除:

// 刪除鍵值對(duì)
console.log(dict.remove("color")); // true
console.log(dict.remove("like")); // false
console.log(dict.remove("skill")); // true
console.log(dict.keyValues());  // [ValuePair]
console.log(dict.hasKey("color")); false
console.log(dict.size()); 1
// 清空字典
dict.clear();
console.log(dict.keyValues()); // []
console.log(dict.isEmpty()); // true

也沒問題,結(jié)果完美!

四、總結(jié)

本篇從頭到尾介紹了字典的相關(guān)知識(shí),你學(xué)會(huì)了嗎?雖然 ES6 提供了原生支持,但是對(duì)于我們學(xué)習(xí)者來說,手動(dòng)實(shí)現(xiàn)一次更有助于了解原理。

到此這篇關(guān)于JavaScript 數(shù)據(jù)結(jié)構(gòu)之字典方法的文章就介紹到這了,更多相關(guān)JavaScript 字典內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中輕松獲取頁(yè)面參數(shù)值的N種方法(含代碼示例)

    JavaScript中輕松獲取頁(yè)面參數(shù)值的N種方法(含代碼示例)

    本文旨在深入淺出地揭示如何在JavaScript中巧妙提取那些隱藏在URL背后的寶貴信息,從基礎(chǔ)方法到高級(jí)技巧,一網(wǎng)打盡,無論你是編程界的菜鳥還是久經(jīng)沙場(chǎng)的老將,這里都有值得你品鑒的“珍饈”,需要的朋友可以參考下
    2024-06-06
  • JavaScript實(shí)現(xiàn)簡(jiǎn)單的二級(jí)導(dǎo)航菜單實(shí)例

    JavaScript實(shí)現(xiàn)簡(jiǎn)單的二級(jí)導(dǎo)航菜單實(shí)例

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單的二級(jí)導(dǎo)航菜單,設(shè)計(jì)javascript動(dòng)態(tài)操作頁(yè)面元素的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • JavaScript瀑布流的實(shí)現(xiàn)你學(xué)會(huì)了嗎

    JavaScript瀑布流的實(shí)現(xiàn)你學(xué)會(huì)了嗎

    這篇文章主要為大家詳細(xì)介紹了JavaScript瀑布流的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 純js實(shí)現(xiàn)圖片勻速淡入淡出效果

    純js實(shí)現(xiàn)圖片勻速淡入淡出效果

    這篇文章主要為大家詳細(xì)介紹了純js實(shí)現(xiàn)圖片勻速淡入淡出效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • JavaScript中三個(gè)等號(hào)和兩個(gè)等號(hào)的區(qū)別(== 和 ===)淺析

    JavaScript中三個(gè)等號(hào)和兩個(gè)等號(hào)的區(qū)別(== 和 ===)淺析

    javascript中比較運(yùn)算符'=='與'==='可能大家用的比較多,但是大家對(duì)他的區(qū)別不是很清楚,接下來小編給大家介紹下js中三個(gè)等號(hào)和兩個(gè)等號(hào)的區(qū)別(== 和 ===),感興趣的朋友可以參考下
    2016-09-09
  • date.parse在IE和FF中的區(qū)別

    date.parse在IE和FF中的區(qū)別

    這個(gè)方法是很常用的,比如在驗(yàn)證輸入日期是否存在時(shí),可以使用它,如果是一個(gè)不存在的日期,則其返回值將是NaN,另外如果要比較兩個(gè)日期的先后,或是計(jì)算兩個(gè)日期相差的天數(shù) ,都可以用到。
    2010-07-07
  • Three.js實(shí)現(xiàn)簡(jiǎn)單3D房間布局

    Three.js實(shí)現(xiàn)簡(jiǎn)單3D房間布局

    這篇文章主要為大家詳細(xì)介紹了Three.js實(shí)現(xiàn)簡(jiǎn)單3D房間布局的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Javascript調(diào)試腳本的經(jīng)驗(yàn)之談

    Javascript調(diào)試腳本的經(jīng)驗(yàn)之談

    隨著用JavaScript編程的深入,你會(huì)開始理解那些JavaScript給出的不透明錯(cuò)誤信息。一旦你理解了你常犯的一般性錯(cuò)誤,你就會(huì)很快知道怎樣避免它們,這樣你寫的代碼中的錯(cuò)誤將越來越少。
    2008-10-10
  • php 修改密碼實(shí)現(xiàn)代碼

    php 修改密碼實(shí)現(xiàn)代碼

    這篇文章主要介紹了php 修改密碼實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • js百度地圖滾輪縮放所在點(diǎn)偏移問題解決

    js百度地圖滾輪縮放所在點(diǎn)偏移問題解決

    本文主要介紹了js百度地圖滾輪縮放所在點(diǎn)偏移問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論

扎鲁特旗| 沙田区| 乐至县| 治县。| 临朐县| 巴青县| 娱乐| 五常市| 册亨县| 师宗县| 天水市| 泗水县| 崇礼县| 靖州| 乡宁县| 阿鲁科尔沁旗| 顺义区| 来安县| 扬州市| 江源县| 榆中县| 海阳市| 苗栗县| 隆安县| 集安市| 安岳县| 临猗县| 彝良县| 怀远县| 伊吾县| 扬州市| 抚松县| 永平县| 庆城县| 三江| 岳普湖县| 萨迦县| 沧州市| 团风县| 齐齐哈尔市| 浮山县|