本文实例讲述了JS模拟实现哈希表及应用。分享给大家供大家参考,具体如下:
在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子。
说明:
这篇文章所写并不是真正意义的哈希表,只是与哈希表的使用有相似之处。第一部分:相关知识点
属性的枚举:
输出:
即对于对象而言,我们可以使用for in来枚举对象的属性。
属性的删除:
对象的属性可以通过 delete 来删除,并且会有一个返回值。 如下:
注意: 一般只有对象的属性才可以删除,而变量是不能删除的,如:
检测属性是否存在:
前者返回true,后者返回false。 即我们可以使用in来确定一个对象是否含有该属性。
属性的添加:
属性的添加非常简单,如上所示,最终打印出来的对象是包含 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) ? 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开始),假设数组元素的值各不相同。
实现如下:
<Meta charset="UTF-8">
哈希表的使用