JavaScript 模拟实现哈希表及双数求和问题应用
本文介绍如何使用 JavaScript 模拟实现哈希表,涵盖属性枚举、删除、检测与添加等基础操作。通过构造函数封装增删改查功能,并应用于解决无序数组中两数之和指定值的问题,返回对应下标,供开发者参考学习。
JavaScript 模拟哈希表实现与应用
本文通过实例展示如何在 JavaScript 中模拟实现哈希表,并提供相关应用案例,供读者参考学习。
在算法设计中,特别是涉及数组处理的场景下,哈希表能高效解决诸多问题。本文将记录 JavaScript 实现哈希表的方法,并给出解决具体实际问题的示例。
需要说明的是,本文所述的实现并非严格意义上的哈希表,其功能与使用场景与标准哈希表存在相似之处。
哈希表相关基础知识
第一部分:相关知识点
属性的枚举操作
var person = {
name: "zzw",
sex: "Male",
age: 21
};
for (var prop in person) {
console.log(prop + " ",person[prop]);
}
输出结果示例

对于 JavaScript 对象,可以使用 for...in 语句来枚举其所有属性。
属性的删除操作
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 关键字删除对象的属性,该操作会返回一个布尔值。具体示例如下

注意:通常情况下,只有对象的属性可以被删除,而普通变量无法通过 delete 删除。例如
var x = 1;
console.log(delete x);
此时控制台会输出 false,因为变量本身是不可被删除的。
检测属性是否存在
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 属性。
JavaScript 哈希表的具体实现
第二部分:使用 JavaScript 实现哈希表
下面通过构造函数创建一个哈希表类,使用时只需实例化该对象即可。该实现提供了较为丰富的功能,在实际问题中可根据需要选择性使用。
// 创建构造函数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>
在实际开发中,可以先编写主要功能,后续如有需要再逐步添加其他特性。
此外,这里提供几款哈希操作相关的在线工具供参考
在线散列/哈希算法加密工具: 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
更多关于 JavaScript 相关内容感兴趣的读者可查看本站专题:《javascript编码操作技巧总结》、《JavaScript加密解密技巧汇总》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述内容对大家学习 JavaScript 程序设计有所帮助。
怎么用 Promise 封装 JavaScript sleep 函数实现异步延时
2026-11-05 17:49:14
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
相关标签:
