在Javascript中实现伪哈希表

  了解数据结构的人应该都听说过哈希表这种数据结构,它是一种典型的利用键值对存储并检索数据的一种非线性结构,又称散列表或杂凑法。在一般的线性表结构中,数据的相对位置是随机的,即数据和用于检索的关键字之间不存在确定的关系,检索数据时往往需要进行一系列的比较,最终找到要检索的数据,这种方法往往建立在循环比较的机制上,利用时间的代价节省了空间,实现了数据的存储和检索功能。而哈希表则使用键值对进行数据的存储,在数据的存储位置和它的关键字之间建立了一一对应的关系,从而使每个关键字和结构中的一个唯一的存储位置相对应,所以在检索数据时,只需要根据这个对应关系便可快速定位到要查找的数据。

    事实上,我们通常并不关心数据是如何存储的,而关心的是我们在使用数据的时候是否方便,例如对数据进行排序、查找、替换等操作,由于这种操作是贯穿在整个应用程序始终的,因此对效率的要求也就很高了。一般的高级语言,如C和C的变种,都提供了用于存储哈希表的数据结构,但在弱类型语言中,如javascript等脚本语言,本身并没有直接提供类似于哈希表的这种结构,不过我们可以从数组出发,按照哈希表的原理自己打造一个脚本语言专有的哈希表数据结构。

    我们知道,在数据中,可以通过下标直接定位到相应数据,也就是用于存储数据的空间,数组的这种特性本身就决定了它可以被用来实现哈希算法,不过在C语言中,数组的下标只能是从0开始的整数,而不能为其它类型的数据,但在javascript中,我们可以借用“对象”这个概念,按照数组的特性来模拟哈希算法。因为在javascript中,对象其实就是属性或方法的一个集合,于是我们可以构造一个Hashtable对象,它有key和value两个属性,自己编写代码来模拟一个完整的哈希表。下面是一段在javascript中实现哈希表的代码:

1 function Hashtable() 
2 {
3   this._hash = {};
4   this._count = 0;
5   this.add = function(key, value) 
6   {
7       if (this._hash.hasOwnProperty(key)) return false;
8       else { this._hash[key] = value; this._count++; return true; }
9   }
10   this.remove = function(key) { delete this._hash[key]; this._count--; }
11   this.count = function() { return this._count; }
12   this.items = function(key) { if (this.contains(key)) return this._hash[key]; }
13   this.contains = function(key) { return this._hash.hasOwnProperty(key); }
14   this.clear = function() { this._hash = {}; this._count = 0; }
15 }

    实现起来很简单,我们在function中定义了一个_hash对象,该对象有一个属性key,我们可以给这个属性赋值,hasOwnProperty方法是javascript提供的方法,用于返回指定的对象中是否包含某个属性。同时我们在该function中还定义了一个_count对象,用于记录Hashtable中的数据个数,因为我们不想每次获取Hashtable中的数据个数时都要通过一个内置的循环来计数,这样开销就会小一些,前面说了,哈希算法的一个基本特性就是效率高。delete语句在javascript中用于销毁一个对象。

    下面是使用该Hashtable的一些例子:

 1 var hashCompany = new Hashtable();
 2 
 3 //向Hashtable中添加键值对
 4 function FillData(arr) {
 5     hashCompany.clear();
 6 
 7     for (var i = 0; i < arr.length - 1; i++) {
 8         if (arr[i] != "") {
 9             t = arr[i].split("`");
10             if (t.length > 2) {
11                 if (!hashCompany.contains(t[0].trim())) {
12                     hashCompany.add(t[0].trim(), t[1]);
13                 }
14             }
15         }
16     }
17 }
18 
19 //遍历Hashtable并取出值
20 function GetDataFromHash() {
21     var s;
22     if (hashCompany.count > 0) {
23         for (var i in hashCompany._hash) {
24             s += i + "|";
25         }
26     }
27 
28     if (s.length > 0) {
29         s = s.substring(0, s.length - 2);
30     }
31 
32     return s;
33 }

    代码比较简单,这里就不再多加说明了,其中用到了一个trim函数,下面补上。

//采用正则表达式去除字符串两端的空格,匿名函数用于扩展String对象的方法
String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }

    哈希表在代码中使用频率很高,灵活使用哈希表可以简化代码并提供诸多方便,尤其是在存储类似于数组的数据并且希望之后能够方便检索。将代码保存于此,以备日后使用。

转载于:https://www.cnblogs.com/yupipi520/archive/2009/03/13/1411139.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板函数与特化函数

本文转自&#xff1a;https://www.cnblogs.com/dracohan/p/3401660.html 转来收藏以便查阅&#xff0c;感谢原作者 今天在写代码时&#xff0c;遇到了模板和特化&#xff0c;在网上找了资料后问题呗一一解决&#xff0c;转载此文用于以后查阅&#xff0c;感谢原创者。其中增加…

这样调试内核启动流程

内核生命周期uboot 打印完 Starting kernel . . .&#xff0c;就完成了自己的使命&#xff0c;控制权便交给了 kernel 的第一条指令&#xff0c;也就是下面这个函数init/main.casmlinkage __visible void __init start_kernel(void){...rest_init();}start_kernel 相当于内核的…

iview实现多文件上传,前段到后台

前段 业务是 分别上传两个文件 &#xff1a;1.一个报告 一个 表格&#xff0c;而且限制了格式 报告为doc 表格为xsl2.有别的参数 也要&#xff0c;比如&#xff0c;上传人&#xff0c;上传日期&#xff0c;中心名称 这样的话&#xff0c;我们无法使用 iview 的直接上传&#x…

ios 图片添加阴影

2019独角兽企业重金招聘Python工程师标准>>> UIimageView *imageView [[UIImageView alloc ] init]; imageView.layer.shadowColor [UIColor blackColor].CGColor; imageView.layer.shadowOffset CGSizeMake(3,2); imageView.layer.shadowOpacity 0.6; imageVie…

asp.net定时执行任务-解决应用池回收问题----转载

在复杂的业务应用程序中&#xff0c;有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行&#xff0c;比如定时备份或同步数据库&#xff0c;定时发送电子邮件&#xff0c;定期处理用户状态信息&#xff0c;支付系统中定期同步异常账单等等&#xff0c;我们…

bool与string互转

今天在工作中遇到了将string转换成bool类型数据&#xff0c;查阅了工具书解决了问题&#xff0c;现将注意要点总结如下&#xff1a; 增加头文件&#xff1a;#include <sstream> 代码如下&#xff1a; 在codeblocks软件上测试结果如下&#xff1a; 使用者需要根据自己的实…

Go语言之高级篇beego框架之参数配置与路由配置

一、参数配置 beego默认会解析当前应用下的conf/app.conf文件 1.1、beego的参数配置 appname WEB httpport 8080 runmode dev 几种开发模式 [dev] httpprot 8080 [prod] httpport 8081 [test] httpport 8082 //备注&#xff1a; beego.AppConfig.String( "dev::m…

C++ int转string以及源码

今天遇到一个int类型数据转换为string&#xff0c;查了资料在c11标准中增加了全局函数std::to_string来实现该功能&#xff1a; string to_string (int val); string to_string (long val); string to_string (long long val); string to_string (unsigned val); string t…

OpenXLive 0.9.9 SDK发布,增加对SNS的支持

相信iOS和Android的游戏玩家对于OpenFeint都会比较熟悉&#xff0c;在北京有着这样的一个团队&#xff0c;他们一直在专注于Windows Phone平台上的第三方游戏社交平台的开发&#xff0c;这个产品叫做OpenXlive&#xff0c;近期发布了其SDK的0.9.9版本&#xff0c;并增加了向Twi…

Asp.Net MVC1.0正式版发布

下载地址: http://www.microsoft.com/downloads/details.aspx?FamilyID53289097-73ce-43bf-b6a6-35e00103cb4b&displaylangen 相对RC2版的变化不大&#xff0c;仅二点: 1.Jquery从1.3.1升级为1.3.2版本 2.修正了MVC Web应用程序中创建Silverlight时因项目不可用而出错的BU…

EUREKA原理总结

Eureka高可用架构 https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance 上图中主要的名称说明&#xff1a; Register&#xff1a;EurekaClient注册&#xff08;Http请求&#xff09;到EurekaServer&#xff0c;EurekaClient会发送自己元数据(ip,port,主页等)&#xff0…

Hadoop之Shell命令

hadoop的shell命令与linux下的命令类似&#xff0c;一般要在命名了的前面加-&#xff0c; 例如&#xff1a;hadoop fs -ls /....... 具体如下&#xff1a; FS Shell 调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式。 所有的的FS shell命令使用URI路径作…

linux下安装oracle 11g R2

Linux环境配置 [c-sharp]view plaincopy OS:Fedora 15 DB:Oracle 11gR2 将Oracle安装到home/oracle_11目录 配置过程&#xff1a;本文来自Oracle官方文档网上资料 Oracle官方文档&#xff1a;http://www.oracle.com/pls/db112/homepage 1. 以root用户登录到Linux 2. 检查机器…

学习:SQL Server的BUILTIN\Administrators用户

在安装SQL Server2000 &#xff0c;安装进程自动地为“BUILTIN\Administrators”创建一个登录帐号&#xff0c;该帐号为“sysadmin”角色成员。“BUILTIN\Administrators”登录帐号代表了Microsoft Window2000 上的系统管理员本地组。 Windows2000的“Administrator”帐户是系统…

通俗理解数字签名,ssl数字证书和https

前言 最近在开发关于PDF合同文档电子签章的功能&#xff0c;大概意思就是在一份PDF合同上签名&#xff0c;盖章&#xff0c;使其具有法律效应。签章有法律效应必须满足两个条件&#xff1a; 能够证明签名&#xff0c;盖章者是谁&#xff0c;无法抵赖PDF合同在签章后不能被更改在…

linux 性能分析工具——perf

最近需要对linux下的开发的数据库应用程序进行性能调试&#xff0c;找到了该篇文章&#xff0c;保存下来为了以后便于查找&#xff0c;这篇是转载的perf文章&#xff0c;后续还有vtune相关的文章。 转载&#xff1a;https://blog.csdn.net/u014608280/article/details/8026571…

红外遥控

红外遥控简介红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力&#xff0c;所…

使用jQuery Mobile移动开发框架将博客网站快速转化为Mobile网站

日期&#xff1a;2012-7-12 来源&#xff1a;GBin1.com 在线演示 jQuery Mobile是一个非常不错的移动端网站应用的解决方案&#xff0c;很多网站都使用jQuery Mobile来生成Mobile手机端的移动网站应用&#xff0c;在过去的GBin1博客文章中&#xff0c;我们曾经使用jQuery Mob…

CISSP的成长之路(十六):复习访问控制(1)

访问控制&#xff08;Access Control&#xff09;是CISSP知识体系中的第三个CBK&#xff0c;它的内容包括如何使用多种系统提供的安全功能来控制对组织的信息和数据处理资源的访问&#xff0c;这些访问控制措施通过管理、物理和逻辑控制的手段 在51CTO安全频道特别策划的CISSP…

NVLink技术及影响解析

1繁华的背面 最新GPU架构Pascal&#xff0c;能自己开上舞台的Audi A7&#xff0c;超过700名与会专家学者及技术人员&#xff0c;近百场学术会议和科研分享&#xff0c;连续两晚的happy hour、酒会和GTC Party……在一片喧嚣和欢乐当中&#xff0c;2014年度的GTC大会降下了帷幕。…