javascript泛型集合類(轉)


前一陣比較忙,一直沒空寫博客...這幾天好容易抽了點空了,昨天發了個數據庫操作組件,今天決定人品爆發一下,把一直醞釀的javascript的泛型集合類給分享給大家.

首先聲明:我的東西不一定適合你,如果你有中肯的評價我很歡迎,如果是沒有什么建設性的評論......我先郁悶下..~~~

我以前發布過一個Hash類,不過現在它升級了.關於javascript的泛型集合類,我這有:List,Dictionary,Stack,Queue共4個.

其中,List,Stack,Queue其實是基於Array實現的,而Dictionary則是用了我之前寫的Hash的一些做法,是基於Object的,所以getItem,remove之類的時間復雜度是1,而不是數組的遍歷n(這一點,是哈希這種數據結構的意義所在,我想了不少的方案,在園子里Kenneth Jing,Jeffrey Zhao等的討論和幫助下,找到了一個比較滿意的方案 :) )

可能這個泛型類庫放出來,大家討論的會比較多...關於它的存在價值我不想多說,不過我想說一點,如果你只是在前台使用,那么它不適合你,它適合構建比較復雜系統,需要多方寫作的場合,適合對js代碼量多一點也無所謂的場合.

針對連同Hash一共5個類,我寫了全部的源代碼和測試代碼,一並在這里下載.

下面我簡單例舉幾個使用示例,關於其內部實現,都在源代碼中,如果你有問題或有建議,你可以留言,或者聯系我的QQ:150866957.另外,如果你找到了BUG,請一定聯系我,謝謝.

還有......本類庫是基於asp.net ajax的(因為我需要它的類型簽名系統嘛),暫時我沒有做成純js的泛型類庫的打算,我是打算吊死在asp.net ajax這棵樹上了,如果你有你的需要,你可以隨意更改.


1)Hash

 1 <script type="text/javascript">
 2        var h1 = new Hash();
 3        h1.add(1,2);
 4        h1.add("aa","xxx");
 5        h1.add("b","yy");
 6        h1.add("c","zzz");
 7 
 8        h1.forEach(function(item,i,h){
 9        alert(item.key+":"+item.value+":"+Object.getTypeName(item.key));
10 });
11 </script>

 

 

2)List

 1 <script type="text/javascript">
 2     var lst = new List(Number)();
 3     lst.add(1);
 4     lst.add(32);
 5     lst.add(444);
 6     
 7     var lst2 = new List(Number)();
 8     lst2.add(-1);    
 9     lst2.insertRange(0,lst);
10     lst2.forEach(function(item,i,lt){
11         alert(item);
12     });
13     alert(lst2.getCount());
14 </script>

 

3)Dictionary

 1 <script type="text/javascript">
 2        var ds = new Dictionary(Number,String)();
 3        ds.add(1,"1");
 4        ds.add(2,"222");
 5        ds.forEach(function(item,i,d){
 6        alert(Object.getTypeName(item.key)+":"+item.key+","+item.value);
 7 });
 8 
 9        var MyClass = function(name){
10        this.name = name;
11 }
12        MyClass.__typeName = 'MyClass';
13        MyClass.__class = true;
14        var a = new MyClass("a");
15        var b = new MyClass("b");
16 
17        var dss = new Dictionary(MyClass,String)();
18 
19        dss.add(a,"x");
20        dss.add(b,"y");
21        dss.forEach(function(item,i,d){
22        alert(Object.getTypeName(item.key)+":"+item.key.name+","+item.value);
23 });
24 </script>

 

 4)Stack

 

1 <script type="text/javascript">
2     var sk = new Stack(Number)();
3     sk.push(1);
4     sk.push(321);
5     sk.forEach(function(item,i,k){
6         alert(item+":"+i);
7     },'a');
8 </script>

 

5)Queue

1 <script type="text/javascript">
2       var qs = new Queue(String)();
3       qs.enqueue("1");
4       qs.enqueue("xxx");
5       qs.forEach(function(item,i,q){
6       alert(item+":"+i);
7 });
8 </script>

歡迎大家指定討論 :)

補:大家可能對效率方面的想法比較多,可以告訴大家,在debug版開發時,會進行類型方面的驗證操作; 

建議在發布的時候,把驗證的代碼全部去除掉,List,Stack,Queue的效率和array是一樣的;另外,Hash和Dictionary不是基於數組的,是用Object實現的,在進行鍵值操作時效率是最高的.這種做法和Asp,net ajax是一樣的 :)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM