js 模拟实现类似c#下的hashtable的简单功能代码


Posted in Javascript onJanuary 24, 2010

如果在c#中,我们只要用hashtable或者dictionary根据key取value的特性,就可以很轻松地实现这个功能了。其实我们稍作处理,js也可以实现类似hashtable的功能。下面总结一下笔者开发中用到的实现方式,贴代码为主。
1、实现思路:主要就是利用原型(prototype)的hasOwnProperty方法,确定对象中的项是该添加、移除还是取出某个匹配的项等。hasOwnProperty比遍历数组取值灵巧快速的地方在于:至少从代码上来看,它是O(1)复杂度的。
2、实现代码

// js哈希表 
function HashTable() { 
this.ObjArr = {}; 
this.Count = 0; 
//添加 
this.Add = function(key, value) { 
if (this.ObjArr.hasOwnProperty(key)) { 
return false; //如果键已经存在,不添加 
} 
else { 
this.ObjArr[key] = value; 
this.Count++; 
return true; 
} 
} 
//是否包含某项 
this.Contains = function(key) { 
return this.ObjArr.hasOwnProperty(key); 
} 
//取某一项 其实等价于this.ObjArr[key] 
this.GetValue = function(key) { 
if (this.Contains(key)) { 
return this.ObjArr[key]; 
} 
else { 
throw Error("Hashtable not cotains the key: " + String(key)); //脚本错误 
//return; 
} 
} 
//移除 
this.Remove = function(key) { 
if (this.Contains(key)) { 
delete this.ObjArr[key]; 
this.Count--; 
} 
} 
//清空 
this.Clear = function() { 
this.ObjArr = {}; this.Count = 0; 
} 
}

3、测试代码
代码
//员工 
function employee(id, userName) { 
this.id = id; 
this.userName = userName; 
} 
function test() { 
var ht = new HashTable(); 
var tmpEmployee = null; 
for (var i = 1; i < 6; i++) { 
tmpEmployee = new employee(i, "Employee_" + i); 
ht.Add(i, tmpEmployee); 
} 
for (var i = 1; i <= ht.Count; i++) { 
alert(ht.GetValue(i).userName); //其实等价于ht.ObjArr[i].userName 
//alert(ht.ObjArr[i].userName); 
} 
ht.Remove(1); 
alert(ht.Contains(1)); //false 
alert(ht.Contains(2)); //true 
//alert(ht.GetValue(1)); //异常 
var result = ht.GetValue(2); 
if (result != null) { 
alert("Employee Id:" + result.id + ";UserName:" + result.userName); 
} 
ht.Add(2, "这一个key已经存在!"); //Add无效 
//ht.Clear(); //清空 
alert(ht.Count); 
}

调用的时候很简单,只要new一个hashtable对象,常见的功能就都有了。是不是很简单?Enjoy it。
小结:原型链(prototype链)和作用域链是js的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。
Javascript 相关文章推荐
javascript window对象属性整理
Oct 24 Javascript
15 个 JavaScript Web UI 库
May 19 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
Dec 08 Javascript
javascript五图轮播切换实用版
Aug 17 Javascript
jquery得到font-size属性值实现代码
Sep 30 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
JavaScript实现DOM对象选择器
Sep 24 Javascript
JS获取一个表单字段中多条数据并转化为json格式
Oct 17 Javascript
Angular项目如何升级至Angular6步骤全纪录
Sep 03 Javascript
小程序如何支持使用 async/await详解
Sep 12 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
Jan 24 #Javascript
优化javascript的执行速度
Jan 23 #Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 #Javascript
JQuery 1.4 中的Ajax问题
Jan 23 #Javascript
用JS写的一个TableView控件代码
Jan 23 #Javascript
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 #Javascript
JavaScript 学习笔记(十四) 正则表达式
Jan 22 #Javascript
You might like
解决中英文字符串长度问题函数
2007/01/16 PHP
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
python 使用get_argument获取url query参数
2017/04/28 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
Python双链表原理与实现方法详解
2020/02/22 Python
利用python画出AUC曲线的实例
2020/02/28 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
审计主管岗位职责
2014/01/31 职场文书
2014年招生工作总结
2014/11/26 职场文书
公司庆典欢迎词
2015/01/26 职场文书
党员年终个人总结
2015/02/14 职场文书
失恋33天观后感
2015/06/11 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL