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 相关文章推荐
摘自启点的main.js
Apr 20 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
Feb 18 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
Jun 09 Javascript
jquery插件推荐 jquery.cookie
Nov 09 Javascript
jQuery中slice()方法用法实例
Jan 07 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 Javascript
3分钟掌握常用的JS操作JSON方法总结
Apr 25 Javascript
Vue.js进阶知识点总结
Apr 01 Javascript
JavaScript实现轮播图效果代码实例
Sep 28 Javascript
vue+springboot图片上传和显示的示例代码
Feb 14 Javascript
详解如何解决使用JSON.stringify时遇到的循环引用问题
Mar 23 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
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
javascript基础知识
2016/06/07 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
Python标准库os.path包、glob包使用实例
2014/11/25 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
暑期培训心得体会
2014/09/02 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
Go语言grpc和protobuf
2022/04/13 Golang