JS模擬實(shí)現(xiàn)哈希表及應(yīng)用詳解
本文實(shí)例講述了JS模擬實(shí)現(xiàn)哈希表及應(yīng)用。分享給大家供大家參考,具體如下:
在算法中,尤其是有關(guān)數(shù)組的算法中,哈希表的使用可以很好的解決問(wèn)題,所以這篇文章會(huì)記錄一些有關(guān)js實(shí)現(xiàn)哈希表并給出解決實(shí)際問(wèn)題的例子。
說(shuō)明: 這篇文章所寫并不是真正意義的哈希表,只是與哈希表的使用有相似之處。
第一部分:相關(guān)知識(shí)點(diǎn)
屬性的枚舉:
var person = { name: "zzw", sex: "Male", age: 21 }; for (var prop in person) { console.log(prop + " ",person[prop]); }
輸出:
即對(duì)于對(duì)象而言,我們可以使用for in來(lái)枚舉對(duì)象的屬性。
屬性的刪除:
var person = { name: "zzw", sex: "Male", age: 21 }; var ifRemove = delete person.name; for (var prop in person) { console.log(prop + " ",person[prop]); } console.log(ifRemove);
對(duì)象的屬性可以通過(guò) delete 來(lái)刪除,并且會(huì)有一個(gè)返回值。 如下:
注意: 一般只有對(duì)象的屬性才可以刪除,而變量是不能刪除的,如:
var x = 1; console.log(delete x);
這時(shí)打印臺(tái)輸出false,因?yàn)樽兞渴遣豢杀粍h除的。
檢測(cè)屬性是否存在:
var person = { name: "zzw", sex: "Male", age: 21 }; console.log("age" in person); console.log("someOther" in person);
前者返回true,后者返回false。 即我們可以使用in來(lái)確定一個(gè)對(duì)象是否含有該屬性。
屬性的添加:
var person = { name: "zzw", sex: "Male", age: 21 }; person["school"] = "XJTU"; console.log(person);
屬性的添加非常簡(jiǎn)單,如上所示,最終打印出來(lái)的對(duì)象是包含 school 屬性的。
第二部分: 使用js實(shí)現(xiàn)哈希表
下面是通過(guò)構(gòu)造函數(shù)得到一個(gè)哈希表,在使用時(shí)只需實(shí)例化即可,且下面的功能較為豐富,在實(shí)際問(wèn)題中,我們可以選擇性的使用 。
// 創(chuàng)建構(gòu)造函數(shù)HashTable function HashTable() { // 初始化哈希表的記錄條數(shù)size var size = 0; // 創(chuàng)建對(duì)象用于接受鍵值對(duì) var res = {}; // 添加關(guān)鍵字,無(wú)返回值 this.add = function (key, value) { //判斷哈希表中是否存在key,若不存在,則size加1,且賦值 if (!this.containKey(key)) { size++; } // 如果之前不存在,賦值; 如果之前存在,覆蓋。 res[key] = value; }; // 刪除關(guān)鍵字, 如果哈希表中包含key,并且delete返回true則刪除,并使得size減1 this.remove = function (key) { if (this.containKey(key) && (delete res[key])) { size--; } }; // 哈希表中是否包含key,返回一個(gè)布爾值 this.containKey = function (key) { return (key in res); }; // 哈希表中是否包含value,返回一個(gè)布爾值 this.containValue = function (value) { // 遍歷對(duì)象中的屬性值,判斷是否和給定value相等 for (var prop in res) { if (res[prop] === value) { return true; } } return false; }; // 根據(jù)鍵獲取value,如果不存在就返回null this.getValue = function (key) { return this.containKey(key) ? res[key] : null; }; // 獲取哈希表中的所有value, 返回一個(gè)數(shù)組 this.getAllValues = function () { var values = []; for (var prop in res) { values.push(res[prop]); } return values; }; // 根據(jù)值獲取哈希表中的key,如果不存在就返回null this.getKey = function (value) { for (var prop in res) { if (res[prop] === value) { return prop; } } // 遍歷結(jié)束沒(méi)有return,就返回null return null; }; // 獲取哈希表中所有的key,返回一個(gè)數(shù)組 this.getAllKeys = function () { var keys = []; for (var prop in res) { keys.push(prop); } return keys; }; // 獲取哈希表中記錄的條數(shù),返回一個(gè)數(shù)值 this.getSize = function () { return size; }; // 清空哈希表,無(wú)返回值 this.clear = function () { size = 0; res = {}; }; }
第三部分: 應(yīng)用實(shí)例
問(wèn)題:給定一個(gè)整型的數(shù)組(無(wú)序),找出其中的兩個(gè)數(shù)使得其和為某個(gè)指定的值,并返回這兩個(gè)數(shù)的下標(biāo)(數(shù)組下標(biāo)從0開(kāi)始),假設(shè)數(shù)組元素的值各不相同。
實(shí)現(xiàn)如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>哈希表的使用</title> </head> <body> <script> function queryIndex(arr, result) { var hashTable = new HashTable(); var arrLength = arr.length; var sub = []; for (var i = 0; i < arrLength; i++) { // 掃描一遍,存儲(chǔ)下標(biāo)和值 hashTable.add(i, arr[i]); } for (var j = 0; j < arrLength; j++) { if (hashTable.containValue(result - arr[j]) && result !== 2*arr[j]) { // 獲取兩個(gè)下標(biāo),跳出循環(huán) sub.push(j); var antherIndex = Number(hashTable.getKey(result - arr[j])); sub.push(antherIndex); break; } } if (sub.length !== 0) { return sub; } else { return -1; } } console.log(queryIndex([1,5,7,3,8], 15)); // 2, 4 console.log(queryIndex([8,18,28,12,29,17], 46)); // 2, 4 console.log(queryIndex([8,18,28,12,29,17], 2)); // -1 // 創(chuàng)建構(gòu)造函數(shù)HashTable function HashTable() { // 初始化哈希表的記錄條數(shù)size var size = 0; // 創(chuàng)建對(duì)象用于接受鍵值對(duì) var res = {}; // 添加關(guān)鍵字,無(wú)返回值 this.add = function (key, value) { //判斷哈希表中是否存在key,若不存在,則size加1,且賦值 if (!this.containKey(key)) { size++; } // 如果之前不存在,賦值; 如果之前存在,覆蓋。 res[key] = value; }; // 刪除關(guān)鍵字, 如果哈希表中包含key,并且delete返回true則刪除,并使得size減1 this.remove = function (key) { if (this.containKey(key) && (delete res[key])) { size--; } }; // 哈希表中是否包含key,返回一個(gè)布爾值 this.containKey = function (key) { return (key in res); }; // 哈希表中是否包含value,返回一個(gè)布爾值 this.containValue = function (value) { // 遍歷對(duì)象中的屬性值,判斷是否和給定value相等 for (var prop in res) { if (res[prop] === value) { return true; } } return false; }; // 根據(jù)鍵獲取value,如果不存在就返回null this.getValue = function (key) { return this.containKey(key) ? res[key] : null; }; // 獲取哈希表中的所有value, 返回一個(gè)數(shù)組 this.getAllValues = function () { var values = []; for (var prop in res) { values.push(res[prop]); } return values; }; // 根據(jù)值獲取哈希表中的key,如果不存在就返回null this.getKey = function (value) { for (var prop in res) { if (res[prop] === value) { return prop; } } // 遍歷結(jié)束沒(méi)有return,就返回null return null; }; // 獲取哈希表中所有的key,返回一個(gè)數(shù)組 this.getAllKeys = function () { var keys = []; for (var prop in res) { keys.push(prop); } return keys; }; // 獲取哈希表中記錄的條數(shù),返回一個(gè)數(shù)值 this.getSize = function () { return size; }; // 清空哈希表,無(wú)返回值 this.clear = function () { size = 0; res = {}; }; } </script> </body> </html>
在實(shí)際的使用過(guò)程中,我們可以先寫出主要的功能,然后有需要再添加。
PS:這里再為大家提供幾款hash操作相關(guān)工具供大家參考使用:
在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript編碼操作技巧總結(jié)》、《JavaScript加密解密技巧匯總》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
javascript 星級(jí)評(píng)分效果(手寫)
今天上午抽空隨手寫了個(gè)星級(jí)評(píng)分的效果,給大家分享下。由于水平有限,如有問(wèn)題請(qǐng)指出;首先要準(zhǔn)備一張星星的圖片,灰色是默認(rèn)狀態(tài),黃色是選擇狀態(tài),需要的朋友可以參考下2012-12-12發(fā)布一個(gè)高效的JavaScript分析、壓縮工具 JavaScript Analyser
發(fā)布一個(gè)高效的JavaScript分析、壓縮工具 JavaScript Analyser...2007-11-11Javascript 實(shí)現(xiàn)計(jì)算器時(shí)間功能詳解及實(shí)例(二)
這篇文章主要介紹了Javascript 實(shí)現(xiàn)計(jì)算器時(shí)間功能詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01javascript textContent與innerText的異同分析
因?yàn)榘l(fā)現(xiàn)網(wǎng)絡(luò)上很少有這方面的內(nèi)容,因此就把自己私有blog上的這篇文章搬出來(lái)到Boluor的公開(kāi)blog,方便其它人查閱。2010-10-10javascript動(dòng)態(tài)控制服務(wù)器控件實(shí)例
在頁(yè)面中放入一個(gè)DropDownList控件,并添加一項(xiàng),用來(lái)分析其產(chǎn)生的HTML代碼,這樣在使用js進(jìn)行動(dòng)態(tài)控制時(shí),將會(huì)非常清晰2014-09-09IE本地存儲(chǔ)userdata的一個(gè)bug說(shuō)明
再一次項(xiàng)目上用到ie的userdata,考慮當(dāng)用戶不使用flash插件用于存儲(chǔ)一些聊天記錄2010-07-07TypeScript中Map對(duì)象使用及Map與字典的區(qū)別詳解
Map對(duì)象主要的應(yīng)用場(chǎng)景在于數(shù)據(jù)重組和數(shù)據(jù)儲(chǔ)存,下面這篇文章主要給大家介紹了TypeScript中Map對(duì)象使用及Map與字典的區(qū)別的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01js數(shù)值計(jì)算時(shí)使用parseInt進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(jquery)
這篇文章主要介紹了js數(shù)值計(jì)算時(shí)使用parseInt進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(jquery),需要的朋友可以參考下2014-10-10uniapp發(fā)送formdata表單請(qǐng)求2種方法(全網(wǎng)最簡(jiǎn)單方法)
這篇文章主要給大家介紹了關(guān)于uniapp發(fā)送formdata表單請(qǐng)求2種方法的相關(guān)資料,本文介紹的方法應(yīng)該是全網(wǎng)最簡(jiǎn)單方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09JS 滾動(dòng)事件window.onscroll與position:fixed寫兼容IE6的回到頂部組件
這篇文章主要介紹了JS 滾動(dòng)事件window.onscroll與position:fixed寫兼容IE6的回到頂部組件的相關(guān)資料,需要的朋友可以參考下2016-10-10