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

  如果在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的两个最核心的部分。学懂并悟透它们,许多复杂问题都会迎刃而解;好好利用它们的特性,我们可以轻松实现非常灵活高效的功能。