本文实例讲述了JS模拟实现哈希表及应用。分享给大家供大家参考,具体如下:
在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子。
说明: 这篇文章所写并不是真正意义的哈希表,只是与哈希表的使用有相似之处。
第一部分:相关知识点
属性的枚举:
var person = {
name: "zzw",
sex: "Male",
age: 21
};
for (var prop in person) {
console.log(prop + " ",person[prop]);
}
输出:
即对于对象而言,我们可以使用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 来删除,并且会有一个返回值。 如下:
注意: 一般只有对象的属性才可以删除,而变量是不能删除的,如:
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 属性的。
第二部分: 使用js实现哈希表
下面是通过构造函数得到一个哈希表,在使用时只需实例化即可,且下面的功能较为丰富,在实际问题中,我们可以选择性的使用 。
// 创建构造函数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) "font-size: medium">第三部分: 应用实例
问题:给定一个整型的数组(无序),找出其中的两个数使得其和为某个指定的值,并返回这两个数的下标(数组下标从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) "color: #800000">PS:这里再为大家提供几款hash操作相关工具供大家参考使用:
在线散列/哈希算法加密工具:
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程序设计有所帮助。
JS,哈希表
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。

