利用javascript特性实现的简单HashTable
令人费解的是js提供了内置的Function、Date、Array等对象,却没有提供HashTable对象,但我们利用对象的特性是可以实现的。
js的对象可以看成为一个的hashtable。在对象生命周期内,开发人员可以动态的为他们添加或删除属性、方法。由于对象自身就具有hashtable的特点,那么我只需要加上方便操作的hashtable接口实现。代码如下:
var HashTable=null;
(function()
{
//static private member
var _h = {};
var _l = 0;
//static private method
//if hash contain key, return true
//else return false
var _contain = function(key)
{
return _h.hasOwnProperty(key);
}
//constructor
HashTable= function(){};
//public method on prototype
HashTable.prototype = {
//hash is or no contain key
contain : function(key)
{
return _contain(key);
},
// add an pair of key and value
// if hash has contain key, then update value
add : function(key, obj)
{
var flag = _contain(key);
_h[key] = obj;
if(!flag)
_l++;
},
//remove an pair of key and value
remove : function(key)
{
if(_contain(key))
{
delete _h[key];
_l--;
}
},
//retrieve value of key from hash
get : function(key)
{
return _h[key];
},
// return hash contain amount of key&value'pair
length : function()
{
return _l;
}
}
})();
var MySpace = {hashTable:new HashTable()};
这个代码简单的实现了hashtable的添加(或更改值)、移除、检索、是否包含key、及hashtable中键值数,代码极其简单,目的也很明确, 不多说。思想就是_h对象的属性名看作key,属性值看作值,进行动态的添加、更改、移除,并进行计数。将_h、_l设计成静态私有成员变 量,_contain方法设计成静态私有方法。通过原型将contain、add、remove、get、length方法公开。简单测试一下:
var h = MySpace.hash;
h.add("sds",{"name":"xxx","age":30});
h.add("sds1",{"name":"xxx1","age":31});
h.add("sds2",{"name":"xxx2","age":32});
alert(h.contain("xxx1"));//true
alert(h.length());//3
h.remove("xxx1");
alert(h.contain("xxx1"));//false
alert(h.length());//2
alert(h.get("xxx").name);//sds;
alert(h.get("xxx").age);//30;
随着ajax的火热及大量应用,将页面的请求分割成多个小的数据请求,提高了用户体验,但增加了服务器的请求次数。因此,页面数据缓存就显得很重要,对于 已请求过的数据,进行缓存,下次调用时就不用从服务器请求了,从而减轻了服务器负担。hashtable是作为缓存数据的最好容器,可以结合你的页面应用 的具体情况对hashtable进 行优化实现,以达到性能、体验最优。
js的对象可以看成为一个的hashtable。在对象生命周期内,开发人员可以动态的为他们添加或删除属性、方法。由于对象自身就具有hashtable的特点,那么我只需要加上方便操作的hashtable接口实现。代码如下:
var HashTable=null;
(function()
{
//static private member
var _h = {};
var _l = 0;
//static private method
//if hash contain key, return true
//else return false
var _contain = function(key)
{
return _h.hasOwnProperty(key);
}
//constructor
HashTable= function(){};
//public method on prototype
HashTable.prototype = {
//hash is or no contain key
contain : function(key)
{
return _contain(key);
},
// add an pair of key and value
// if hash has contain key, then update value
add : function(key, obj)
{
var flag = _contain(key);
_h[key] = obj;
if(!flag)
_l++;
},
//remove an pair of key and value
remove : function(key)
{
if(_contain(key))
{
delete _h[key];
_l--;
}
},
//retrieve value of key from hash
get : function(key)
{
return _h[key];
},
// return hash contain amount of key&value'pair
length : function()
{
return _l;
}
}
})();
var MySpace = {hashTable:new HashTable()};
这个代码简单的实现了hashtable的添加(或更改值)、移除、检索、是否包含key、及hashtable中键值数,代码极其简单,目的也很明确, 不多说。思想就是_h对象的属性名看作key,属性值看作值,进行动态的添加、更改、移除,并进行计数。将_h、_l设计成静态私有成员变 量,_contain方法设计成静态私有方法。通过原型将contain、add、remove、get、length方法公开。简单测试一下:
var h = MySpace.hash;
h.add("sds",{"name":"xxx","age":30});
h.add("sds1",{"name":"xxx1","age":31});
h.add("sds2",{"name":"xxx2","age":32});
alert(h.contain("xxx1"));//true
alert(h.length());//3
h.remove("xxx1");
alert(h.contain("xxx1"));//false
alert(h.length());//2
alert(h.get("xxx").name);//sds;
alert(h.get("xxx").age);//30;
随着ajax的火热及大量应用,将页面的请求分割成多个小的数据请求,提高了用户体验,但增加了服务器的请求次数。因此,页面数据缓存就显得很重要,对于 已请求过的数据,进行缓存,下次调用时就不用从服务器请求了,从而减轻了服务器负担。hashtable是作为缓存数据的最好容器,可以结合你的页面应用 的具体情况对hashtable进 行优化实现,以达到性能、体验最优。