在算法中,尤爲是有關數組的算法中,哈希表的使用能夠很好的解決問題,因此這篇文章會記錄一些有關js實現哈希表並給出解決實際問題的例子。html
說明: 這篇博客所寫並非真正意義的哈希表,只是與哈希表的使用有類似之處。算法
屬性的枚舉:數組
var person = { name: "zzw", sex: "Male", age: 21 }; for (var prop in person) { console.log(prop + " ",person[prop]); }
輸出:函數
即對於對象而言,咱們可使用for in來枚舉對象的屬性。this
屬性的刪除:spa
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);
對象的屬性能夠經過 delete 來刪除,而且會有一個返回值。 以下:code
注意: 通常只有對象的屬性才能夠刪除,而變量是不能刪除的,如:htm
var x = 1; console.log(delete x);
這時打印臺輸出false,由於變量是不可被刪除的。對象
檢測屬性是否存在:blog
var person = { name: "zzw", sex: "Male", age: 21 }; console.log("age" in person); console.log("someOther" in person);
前者返回true,後者返回false。 即咱們可使用in來肯定一個對象是否含有該屬性。
屬性的添加:
var person = { name: "zzw", sex: "Male", age: 21 }; person["school"] = "XJTU"; console.log(person);
屬性的添加很是簡單,如上所示,最終打印出來的對象是包含 school 屬性的。
下面是經過構造函數獲得一個哈希表,在使用時只需實例化便可,且下面的功能較爲豐富,在實際問題中,咱們能夠選擇性的使用 。
// 建立構造函數HashTable function HashTable() { // 初始化哈希表的記錄條數size var size = 0; // 建立對象用於接受鍵值對 var res = {}; // 添加關鍵字,無返回值 this.add = function (key, value) { //判斷哈希表中是否存在key,若不存在,則size加1,且賦值 if (!this.containKey(key)) { size++; } // 若是以前不存在,賦值; 若是以前存在,覆蓋。 res[key] = value; }; // 刪除關鍵字, 若是哈希表中包含key,而且delete返回true則刪除,並使得size減1 this.remove = function (key) { if (this.containKey(key) && (delete res[key])) { size--; } }; // 哈希表中是否包含key,返回一個布爾值 this.containKey = function (key) { return (key in res); }; // 哈希表中是否包含value,返回一個布爾值 this.containValue = function (value) { // 遍歷對象中的屬性值,判斷是否和給定value相等 for (var prop in res) { if (res[prop] === value) { return true; } } return false; }; // 根據鍵獲取value,若是不存在就返回null this.getValue = function (key) { return this.containKey(key) ? res[key] : null; }; // 獲取哈希表中的全部value, 返回一個數組 this.getAllValues = function () { var values = []; for (var prop in res) { values.push(res[prop]); } return values; }; // 根據值獲取哈希表中的key,若是不存在就返回null this.getKey = function (value) { for (var prop in res) { if (res[prop] === value) { return prop; } } // 遍歷結束沒有return,就返回null return null; }; // 獲取哈希表中全部的key,返回一個數組 this.getAllKeys = function () { var keys = []; for (var prop in res) { keys.push(prop); } return keys; }; // 獲取哈希表中記錄的條數,返回一個數值 this.getSize = function () { return size; }; // 清空哈希表,無返回值 this.clear = function () { size = 0; res = {}; }; }
問題:給定一個整型的數組(無序),找出其中的兩個數使得其和爲某個指定的值,並返回這兩個數的下標(數組下標從0開始),假設數組元素的值各不相同。
實現以下:
<!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++) { // 掃描一遍,存儲下標和值 hashTable.add(i, arr[i]); } for (var j = 0; j < arrLength; j++) { if (hashTable.containValue(result - arr[j]) && result !== 2*arr[j]) { // 獲取兩個下標,跳出循環 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 // 建立構造函數HashTable function HashTable() { // 初始化哈希表的記錄條數size var size = 0; // 建立對象用於接受鍵值對 var res = {}; // 添加關鍵字,無返回值 this.add = function (key, value) { //判斷哈希表中是否存在key,若不存在,則size加1,且賦值 if (!this.containKey(key)) { size++; } // 若是以前不存在,賦值; 若是以前存在,覆蓋。 res[key] = value; }; // 刪除關鍵字, 若是哈希表中包含key,而且delete返回true則刪除,並使得size減1 this.remove = function (key) { if (this.containKey(key) && (delete res[key])) { size--; } }; // 哈希表中是否包含key,返回一個布爾值 this.containKey = function (key) { return (key in res); }; // 哈希表中是否包含value,返回一個布爾值 this.containValue = function (value) { // 遍歷對象中的屬性值,判斷是否和給定value相等 for (var prop in res) { if (res[prop] === value) { return true; } } return false; }; // 根據鍵獲取value,若是不存在就返回null this.getValue = function (key) { return this.containKey(key) ? res[key] : null; }; // 獲取哈希表中的全部value, 返回一個數組 this.getAllValues = function () { var values = []; for (var prop in res) { values.push(res[prop]); } return values; }; // 根據值獲取哈希表中的key,若是不存在就返回null this.getKey = function (value) { for (var prop in res) { if (res[prop] === value) { return prop; } } // 遍歷結束沒有return,就返回null return null; }; // 獲取哈希表中全部的key,返回一個數組 this.getAllKeys = function () { var keys = []; for (var prop in res) { keys.push(prop); } return keys; }; // 獲取哈希表中記錄的條數,返回一個數值 this.getSize = function () { return size; }; // 清空哈希表,無返回值 this.clear = function () { size = 0; res = {}; }; } </script> </body> </html>
在實際的使用過程當中,咱們能夠先寫出主要的功能,而後有須要再添加。