JS模擬實(shí)現(xiàn)哈希表及應(yīng)用詳解
本文實(shí)例講述了JS模擬實(shí)現(xiàn)哈希表及應(yīng)用。分享給大家供大家參考,具體如下:
在算法中,尤其是有關(guān)數(shù)組的算法中,哈希表的使用可以很好的解決問題,所以這篇文章會(huì)記錄一些有關(guān)js實(shí)現(xiàn)哈希表并給出解決實(shí)際問題的例子。
說明: 這篇文章所寫并不是真正意義的哈希表,只是與哈希表的使用有相似之處。
第一部分:相關(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來枚舉對(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ì)象的屬性可以通過 delete 來刪除,并且會(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來確定一個(gè)對(duì)象是否含有該屬性。
屬性的添加:
var person = {
name: "zzw",
sex: "Male",
age: 21
};
person["school"] = "XJTU";
console.log(person);
屬性的添加非常簡(jiǎn)單,如上所示,最終打印出來的對(duì)象是包含 school 屬性的。
第二部分: 使用js實(shí)現(xiàn)哈希表
下面是通過構(gòu)造函數(shù)得到一個(gè)哈希表,在使用時(shí)只需實(shí)例化即可,且下面的功能較為豐富,在實(shí)際問題中,我們可以選擇性的使用 。
// 創(chuàng)建構(gòu)造函數(shù)HashTable
function HashTable() {
// 初始化哈希表的記錄條數(shù)size
var size = 0;
// 創(chuàng)建對(duì)象用于接受鍵值對(duì)
var res = {};
// 添加關(guān)鍵字,無返回值
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é)束沒有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;
};
// 清空哈希表,無返回值
this.clear = function () {
size = 0;
res = {};
};
}
第三部分: 應(yīng)用實(shí)例
問題:給定一個(gè)整型的數(shù)組(無序),找出其中的兩個(gè)數(shù)使得其和為某個(gè)指定的值,并返回這兩個(gè)數(shù)的下標(biāo)(數(shù)組下標(biāo)從0開始),假設(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)鍵字,無返回值
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é)束沒有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;
};
// 清空哈希表,無返回值
this.clear = function () {
size = 0;
res = {};
};
}
</script>
</body>
</html>
在實(shí)際的使用過程中,我們可以先寫出主要的功能,然后有需要再添加。
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)文章
JS實(shí)現(xiàn)超過長(zhǎng)度限制后自動(dòng)跳轉(zhuǎn)下一款文本框的方法
這篇文章主要介紹了JS實(shí)現(xiàn)超過長(zhǎng)度限制后自動(dòng)跳轉(zhuǎn)下一款文本框的方法,涉及javascript操作字符及本文框的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
JavaScript查看代碼運(yùn)行效率console.time()與console.timeEnd()用法
今天小編就為大家分享一篇關(guān)于JavaScript查看代碼運(yùn)行效率console.time()與console.timeEnd()用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
一文總結(jié)JavaScript中常見的設(shè)計(jì)模式
在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語言的實(shí)現(xiàn)都是基于“類”。在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語言的實(shí)現(xiàn)都是基于“類”。,本文將總結(jié)了JavaScript中常見的十五種設(shè)計(jì)模式,感興趣的朋友可以參考下2023-05-05
原生JS實(shí)現(xiàn)的放大鏡效果實(shí)例代碼
放大鏡大家在各大網(wǎng)站都能見到,下面小編給大家分享一段 ,代碼是基于原生js實(shí)現(xiàn)的放大鏡效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-10-10
JavaScript開發(fā)中需要搞懂的字符編碼總結(jié)
字符集就是字符的集合,字符編碼則代表字符集的實(shí)際編碼規(guī)則,是用于計(jì)算機(jī)解析字符的。本文為大家整理了JavaScript開發(fā)中需要搞懂的字符編碼,希望對(duì)大家有所幫助2023-02-02
javascript實(shí)現(xiàn)前端input密碼輸入強(qiáng)度驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)前端input密碼輸入強(qiáng)度驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
JavaScript設(shè)計(jì)模式之緩存代理模式原理與簡(jiǎn)單用法示例
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之緩存代理模式原理與簡(jiǎn)單用法,結(jié)合實(shí)例形式簡(jiǎn)要分析了javascript緩存代理模式的基本原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-08-08

