js 模擬實(shí)現(xiàn)類似c#下的hashtable的簡單功能代碼
更新時(shí)間:2010年01月24日 14:30:12 作者:
越來越感覺js對(duì)集合的處理沒有c#強(qiáng)大。比如在實(shí)際開發(fā)中,經(jīng)常用到在一維數(shù)組或者二維數(shù)組里取某一個(gè)滿足某些條件的項(xiàng),通常的處理方式就是遍歷數(shù)組,對(duì)比條件,匹配就取出,然后結(jié)束循環(huán)。
如果在c#中,我們只要用hashtable或者dictionary根據(jù)key取value的特性,就可以很輕松地實(shí)現(xiàn)這個(gè)功能了。其實(shí)我們稍作處理,js也可以實(shí)現(xiàn)類似hashtable的功能。下面總結(jié)一下筆者開發(fā)中用到的實(shí)現(xiàn)方式,貼代碼為主。
1、實(shí)現(xiàn)思路:主要就是利用原型(prototype)的hasOwnProperty方法,確定對(duì)象中的項(xiàng)是該添加、移除還是取出某個(gè)匹配的項(xiàng)等。hasOwnProperty比遍歷數(shù)組取值靈巧快速的地方在于:至少從代碼上來看,它是O(1)復(fù)雜度的。
2、實(shí)現(xiàn)代碼
// js哈希表
function HashTable() {
this.ObjArr = {};
this.Count = 0;
//添加
this.Add = function(key, value) {
if (this.ObjArr.hasOwnProperty(key)) {
return false; //如果鍵已經(jīng)存在,不添加
}
else {
this.ObjArr[key] = value;
this.Count++;
return true;
}
}
//是否包含某項(xiàng)
this.Contains = function(key) {
return this.ObjArr.hasOwnProperty(key);
}
//取某一項(xiàng) 其實(shí)等價(jià)于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)); //腳本錯(cuò)誤
//return;
}
}
//移除
this.Remove = function(key) {
if (this.Contains(key)) {
delete this.ObjArr[key];
this.Count--;
}
}
//清空
this.Clear = function() {
this.ObjArr = {}; this.Count = 0;
}
}
3、測(cè)試代碼
代碼
//員工
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); //其實(shí)等價(jià)于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, "這一個(gè)key已經(jīng)存在!"); //Add無效
//ht.Clear(); //清空
alert(ht.Count);
}
調(diào)用的時(shí)候很簡單,只要new一個(gè)hashtable對(duì)象,常見的功能就都有了。是不是很簡單?Enjoy it。
小結(jié):原型鏈(prototype鏈)和作用域鏈?zhǔn)莏s的兩個(gè)最核心的部分。學(xué)懂并悟透它們,許多復(fù)雜問題都會(huì)迎刃而解;好好利用它們的特性,我們可以輕松實(shí)現(xiàn)非常靈活高效的功能。
1、實(shí)現(xiàn)思路:主要就是利用原型(prototype)的hasOwnProperty方法,確定對(duì)象中的項(xiàng)是該添加、移除還是取出某個(gè)匹配的項(xiàng)等。hasOwnProperty比遍歷數(shù)組取值靈巧快速的地方在于:至少從代碼上來看,它是O(1)復(fù)雜度的。
2、實(shí)現(xiàn)代碼
復(fù)制代碼 代碼如下:
// js哈希表
function HashTable() {
this.ObjArr = {};
this.Count = 0;
//添加
this.Add = function(key, value) {
if (this.ObjArr.hasOwnProperty(key)) {
return false; //如果鍵已經(jīng)存在,不添加
}
else {
this.ObjArr[key] = value;
this.Count++;
return true;
}
}
//是否包含某項(xiàng)
this.Contains = function(key) {
return this.ObjArr.hasOwnProperty(key);
}
//取某一項(xiàng) 其實(shí)等價(jià)于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)); //腳本錯(cuò)誤
//return;
}
}
//移除
this.Remove = function(key) {
if (this.Contains(key)) {
delete this.ObjArr[key];
this.Count--;
}
}
//清空
this.Clear = function() {
this.ObjArr = {}; this.Count = 0;
}
}
3、測(cè)試代碼
代碼
復(fù)制代碼 代碼如下:
//員工
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); //其實(shí)等價(jià)于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, "這一個(gè)key已經(jīng)存在!"); //Add無效
//ht.Clear(); //清空
alert(ht.Count);
}
調(diào)用的時(shí)候很簡單,只要new一個(gè)hashtable對(duì)象,常見的功能就都有了。是不是很簡單?Enjoy it。
小結(jié):原型鏈(prototype鏈)和作用域鏈?zhǔn)莏s的兩個(gè)最核心的部分。學(xué)懂并悟透它們,許多復(fù)雜問題都會(huì)迎刃而解;好好利用它們的特性,我們可以輕松實(shí)現(xiàn)非常靈活高效的功能。
相關(guān)文章
javascript 上下banner替換具體實(shí)現(xiàn)
這篇文章介紹了javascript 上下banner替換具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-11-11javaScript矢量圖表庫-gRaphael幾行代碼實(shí)現(xiàn)精美的條形圖/餅圖/點(diǎn)圖/曲線圖
gRaphael是一個(gè)致力于幫助開發(fā)人員在網(wǎng)頁中繪制各種精美圖表的 Javascript庫,你只需要編寫幾行簡單的代碼就能創(chuàng)建出精美的條形圖、餅圖、點(diǎn)圖和曲線圖,感興趣的朋友可以了解下2013-01-01javascript完整操作Table的增加行,刪除行的列子大全
非常漂亮的js操作table行代碼函數(shù)。比較方便2008-10-10JavaScript設(shè)計(jì)模式之外觀模式介紹
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之外觀模式介紹,外觀模式是用于由于子系統(tǒng)或程序組成較復(fù)雜而提供的一個(gè)高層界面接口,使用客戶端更容易訪問底層的程序或系統(tǒng)接口,需要的朋友可以參考下2014-12-12javascript正則表達(dá)式中參數(shù)g(全局)的作用
表達(dá)式加上參數(shù)g之后,表明可以進(jìn)行全局匹配,注意這里可以的含義。2010-11-11