前一阵比较忙,一直没空写博客...这几天好容易抽了点空了,昨天发了个数据库操作组件,今天决定人品爆发一下,把一直酝酿的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是一样的 :)