javascript中的hashtable实现

javascript中没有像c#,java那样的哈希表(hashtable),
然而,javascript中的Array也只有一些类似于'哈希表'的非常简单功能, 如下:
  1.  var arr = new Array();
  2.  arr['item1'] = 'the value of item 1 ';
  3.  arr['item2'] = 'the value of item 2 ';
  4.  alert(arr['item1']);
  5.  alert(arr['item2']);


但上述功能,不符我们的实际要求,另外查询遍历也不方便,我们需要在Array的基础上进行扩展,
下面我们可以用js中的数组来实现类似的hashtable的功能,
  1. function Hashtable(){
  2.     this.clear = hashtable_clear;
  3.     this.containsKey = hashtable_containsKey;
  4.     this.containsValue = hashtable_containsValue;
  5.     this.get = hashtable_get;
  6.     this.isEmpty = hashtable_isEmpty;
  7.     this.keys = hashtable_keys;
  8.     this.put = hashtable_put;
  9.     this.remove = hashtable_remove;
  10.     this.size = hashtable_size;
  11.     this.toString = hashtable_toString;
  12.     this.values = hashtable_values;
  13.     this.hashtable = new Array();
  14. }                

  15. function hashtable_clear(){
  16.     this.hashtable = new Array();
  17. }

  18. function hashtable_containsKey(key){
  19.     var exists = false;
  20.     for (var i in this.hashtable) {
  21.         if (i == key && this.hashtable[i] != null) {
  22.             exists = true;
  23.             break;
  24.         }
  25.     }
  26.     return exists;
  27. }

  28. function hashtable_containsValue(value){
  29.     var contains = false;
  30.     if (value != null) {
  31.         for (var i in this.hashtable) {
  32.             if (this.hashtable[i] == value) {
  33.                 contains = true;
  34.                 break;
  35.             }
  36.         }
  37.     }
  38.     return contains;
  39. }

  40. function hashtable_get(key){
  41.     return this.hashtable[key];
  42. }

  43. function hashtable_isEmpty(){
  44.     return (this.size == 0) ? true : false;
  45. }

  46. function hashtable_keys(){
  47.     var keys = new Array();
  48.     for (var i in this.hashtable) {
  49.         if (this.hashtable[i] != null
  50.             keys.push(i);
  51.     }
  52.     return keys;
  53. }

  54. function hashtable_put(key, value){
  55.     if (key == null || value == null) {
  56.         throw 'NullPointerException {' + key + '},{' + value + '}';
  57.     }else{
  58.         this.hashtable[key] = value;
  59.     }
  60. }

  61. function hashtable_remove(key){
  62.     var rtn = this.hashtable[key];
  63.     //this.hashtable[key] =null;
  64.     this.hashtable.splice(key,1);
  65.     return rtn;
  66. }

  67. function hashtable_size(){
  68.     var size = 0;
  69.     for (var i in this.hashtable) {
  70.         if (this.hashtable[i] != null
  71.             size ++;
  72.     }
  73.     return size;
  74. }

  75. function hashtable_toString(){
  76.     var result = '';
  77.     for (var i in this.hashtable)
  78.     {      
  79.         if (this.hashtable[i] != null
  80.             result += '{' + i + '},{' + this.hashtable[i] + '}\n';   
  81.     }
  82.     return result;
  83. }

  84. function hashtable_values(){
  85.     var values = new Array();
  86.     for (var i in this.hashtable) {
  87.         if (this.hashtable[i] != null
  88.             values.push(this.hashtable[i]);
  89.     }
  90.     return values;
  91. }
Hastable类使用方法:

  1. //实例化一个自定义的哈希表类
  2. var hashTable = new Hashtable();

  3. hashTable.put(0,'abc');  //0为key, 'abc'为value
  4. hashTable.put(1,'123');
  5. hashTable.put(2,'88a');
  6. hashTable.put(3,'88a');

  7. //遍历hashtable, 相当于c#和java中的foreach
  8. for (var key in hashTable.keys()){ /* 用keys方法 */
  9.     alert(hashTable.get(key)); //按key遍历value
  10. }

  11. //遍历hashtable, 相当于c#和java中的foreach
  12. for (var key in hashTable.hashtable)){ /* 用hashtable属性 */
  13.     alert(hashTable.get(key)); //按key遍历value
  14. }

  15. alert(hashTable.containsKey(1));        //返回true
  16. alert(hashTable.containsKey(4));      //因为不存在key为4的,返回false

  17. alert(
    hashTable.containsValue('888'));  //返回true
  18. alert(hashTable.containsValue('mobidogs')); //因为不存在value为'mobidogs'的,返回false

  19. hashTable.remove(1);  //移除key为1的元素
  20. alert(hashTable.containsKey(1));        //因为key为1的元素已被上行的reomve()方法移除,所以返回false

  1. //关于hastable的其它方法使用简单,读者可以自己测试 (此略)
posted @ 2009-10-13 17:02  PointNet  阅读(478)  评论(1编辑  收藏  举报