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 相关文章推荐
JS target与currentTarget区别说明
Aug 28 Javascript
Jquery提交表单 Form.js官方插件介绍
Mar 01 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
Sep 03 Javascript
怎么引入(调用)一个JS文件
May 26 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
Oct 27 Javascript
js 颜色选择插件
Jan 23 Javascript
Bootstrap笔记之缩略图、警告框实例详解
Mar 09 Javascript
js 函数式编程学习笔记
Mar 25 Javascript
详解Vue使用 vue-cli 搭建项目
Apr 20 Javascript
详解使用React进行组件库开发
Feb 06 Javascript
node和vue实现商城用户地址模块
Dec 05 Javascript
React优化子组件render的使用
May 12 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
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
jQuery 连续列表实现代码
2009/12/21 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
Python与Redis的连接教程
2015/04/22 Python
Python psutil模块简单使用实例
2015/04/28 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
用基于python的appium爬取b站直播消费记录
2021/04/17 Python