js实现哈希表(HashTable)
在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子。
说明: 这篇博客所写并不是真正意义的哈希表,只是与哈希表的使用有相似之处。
第一部分:相关知识点
属性的枚举:
var person = {
name: "zzw",
sex: "Male",
age:
};
for (var prop in person) {
console.log(prop + " ",person[prop]);
}
输出:

即对于对象而言,我们可以使用for in来枚举对象的属性。
属性的删除:
var person = {
name: "zzw",
sex: "Male",
age:
};
var ifRemove = delete person.name;
for (var prop in person) {
console.log(prop + " ",person[prop]);
}
console.log(ifRemove);
对象的属性可以通过 delete 来删除,并且会有一个返回值。 如下:

注意: 一般只有对象的属性才可以删除,而变量是不能删除的,如:
var x = ;
console.log(delete x);
这时打印台输出false,因为变量是不可被删除的。
检测属性是否存在:
var person = {
name: "zzw",
sex: "Male",
age:
};
console.log("age" in person);
console.log("someOther" in person);
前者返回true,后者返回false。 即我们可以使用in来确定一个对象是否含有该属性。
属性的添加:
var person = {
name: "zzw",
sex: "Male",
age:
};
person["school"] = "XJTU";
console.log(person);
属性的添加非常简单,如上所示,最终打印出来的对象是包含 school 属性的。
第二部分: 使用js实现哈希表
下面是通过构造函数得到一个哈希表,在使用时只需实例化即可,且下面的功能较为丰富,在实际问题中,我们可以选择性的使用 。
// 创建构造函数HashTable
function HashTable() {
// 初始化哈希表的记录条数size
var size = ; // 创建对象用于接受键值对
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 = ;
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 = ; i < arrLength; i++) { // 扫描一遍,存储下标和值
hashTable.add(i, arr[i]);
}
for (var j = ; j < arrLength; j++) {
if (hashTable.containValue(result - arr[j]) && result !== *arr[j]) {
// 获取两个下标,跳出循环
sub.push(j);
var antherIndex = Number(hashTable.getKey(result - arr[j]));
sub.push(antherIndex);
break;
}
}
if (sub.length !== ) {
return sub;
} else {
return -;
} }
console.log(queryIndex([,,,,], )); // 2, 4
console.log(queryIndex([,,,,,], )); // 2, 4
console.log(queryIndex([,,,,,], )); // -1 // 创建构造函数HashTable
function HashTable() {
// 初始化哈希表的记录条数size
var size = ; // 创建对象用于接受键值对
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 = ;
res = {};
};
}
</script>
</body>
</html>
在实际的使用过程中,我们可以先写出主要的功能,然后有需要再添加。
js实现哈希表(HashTable)的更多相关文章
- 哈希表(hashtable)的javascript简单实现
javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...
- 哈希表(Hashtable)简述
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...
- c/c++ 哈希表 hashtable
c/c++ 哈希表 hashtable 概念:用key去查找value 实现hash函数有很多方法,本文用除留余数法. 除留余数法的概念: 取一个固定的基数的余数,注意不能用偶数,用偶数的话,分布会不 ...
- C#中哈希表(HashTable)的用法详解以及和Dictionary比较
1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...
- js中哈希表的几种用法总结
本篇文章只要是对js中哈希表的几种用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. <html> <head> <script type=" ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- js语言评价--js 基于哈希表、原型链、作用域、属性类型可配置的多范式编程语言
js 基于哈希表.原型链.作用域.属性类型可配置的多范式编程语言 值类型.引用类型.直接赋值: 原型是以对象形式存在的类型信息. ECMA-262把对象定义为:无序属性的集合,其属性可以包含基本值,对 ...
- 转 C#中哈希表(HashTable)的用法详解
看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...
- C# 哈希表HashTable的简单使用
本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...
随机推荐
- flume-sink报错 java.lang.IllegalStateException: close() called when transaction is OPEN - you must either commit or rollback first
1. 确认代码无误(根据情况修改,表示若获得不了数据不会自动commit或者rollback): Event event = channel.take(); if (event == null) { ...
- 使用curl上传报错问题排查
1. THE STOR COMMAND 说明存储出了问题,处理方案: 方案1: 请检查ftp服务器存储是否已满,若已满则清理一下空间即可. 方案2: 若ftp服务器存储未满,请检查是否有上传了的文件, ...
- javascipt : reduce
$scope.totalPrice = function () { return $scope.addcartProduct.reduce(function (money, product) { re ...
- win8系统不小心禁用了管理员权限怎么解决
第一步:查看系统有没有其他管理员账户 按win+x键,然后选择命令提示符 点击命令提示符打开窗口,输入net localgroup Administrators命令,然后回车 如上图,查看窗口中的&q ...
- Asp.Net 常用工具类之Office—Excel导入(5)
之前在做一个项目的时候,客户方面只提供了一份简单的Excel文件,且要跟现有数据进行对接. 当时想到的是如果数据量不大,可以Excel一条一条加进去,无奈数据有几十兆!!! 换了一种思维,进行了导入: ...
- Spring 3.0 Aop 入门
关于Aop的原理,动态代理,反射,之类的底层java技术网上搜一堆一堆的..我就不多说了,主要说在spring上使用aop的方法. 首先不得不说一下的就是,spring aop的支持需要外部依赖包: ...
- 学习H5一周随笔
H5学习也已经进行了一个周了,除了学习过程中的乱哄哄的脑子,对H5初学者(我)常见的问题有了如下见解. 1.初学者在建立新的Html文件之后,有时候会把 <meta charset=" ...
- Spring Boot 相关文章目录
目录 监控 SpringBoot之旅 -- SpringBoot 项目健康检查与监控
- WeMall微商城源码报名插件Apply的主要源码
WeMall微信商城源码报名插件Apply,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace A ...
- 【Javascript】搞定JS面试——跨域问题
什么是跨域? 为什么不能跨域? 跨域的解决方案都有哪些(解决方法/适用场景/get还是post)? 一.什么是跨域? 只要协议.域名.端口有任何一个不同,就是跨域. ...