无梦家园

无梦家园
posts - 21, comments - 151, trackbacks - 8, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

javascript泛型集合类大派送啦

Posted on 2007-04-26 17:21 沧桑雨迢迢 阅读(2847) 评论(12)  编辑 收藏 网摘 所属分类: JavascriptAsp.net Ajax
      前一阵比较忙,一直没空写博客...这几天好容易抽了点空了,昨天发了个数据库操作组件,今天决定人品爆发一下,把一直酝酿的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
<script type="text/javascript">   
var h1 = new Hash();
h1.add(
1,2);
h1.add(
"aa","xxx");
h1.add(
"b","yy");
h1.add(
"c","zzz");

h1.forEach(
function(item,i,h){
    alert(item.key
+":"+item.value+":"+Object.getTypeName(item.key));
}
);
</script>
2)List
<script type="text/javascript">
    
var lst = new List(Number)();
    lst.add(
1);
    lst.add(
32);
    lst.add(
444);
    
    
var lst2 = new List(Number)();
    lst2.add(
-1);    
    lst2.insertRange(
0,lst);
    lst2.forEach(
function(item,i,lt){
        alert(item);
    }
);
    alert(lst2.getCount()); 
</script>
3)Dictionary
<script type="text/javascript">
var ds = new Dictionary(Number,String)();
ds.add(
1,"1");
ds.add(
2,"222");
ds.forEach(
function(item,i,d){
    alert(Object.getTypeName(item.key)
+":"+item.key+","+item.value);
}
);

var MyClass = function(name){
    
this.name = name;
}

MyClass.__typeName 
= 'MyClass';
MyClass.__class 
= true;
var a = new MyClass("a");
var b = new MyClass("b");

var dss = new Dictionary(MyClass,String)();

dss.add(a,
"x");
dss.add(b,
"y");
dss.forEach(
function(item,i,d){
    alert(Object.getTypeName(item.key)
+":"+item.key.name+","+item.value);
}
);
</script>
4)Stack
<script type="text/javascript">
    
var sk = new Stack(Number)();
    sk.push(
1);
    sk.push(
321);
    sk.forEach(
function(item,i,k){
        alert(item
+":"+i);
    }
,'a');
</script>
5)Queue
<script type="text/javascript">
var qs = new Queue(String)();
qs.enqueue(
"1");
qs.enqueue(
"xxx");
qs.forEach(
function(item,i,q){
    alert(item
+":"+i);
}
);
</script>

      欢迎大家指定讨论 :)
      补:大家可能对效率方面的想法比较多,可以告诉大家,在debug版开发时,会进行类型方面的验证操作;
建议在发布的时候,把验证的代码全部去除掉,List,Stack,Queue的效率和array是一样的;另外,Hash和Dictionary不是基于数组的,是用Object实现的,在进行键值操作时效率是最高的.这种做法和Asp,net ajax是一样的 :)

Feedback

#1楼    回复  引用  查看    

2007-04-26 17:30 by 随风流月      
好东西;不知效率如何。

#2楼 [楼主]   回复  引用  查看    

2007-04-26 17:35 by 沧桑雨迢迢      
在debug版开发时,会进行类型方面的验证操作;
建议在发布的时候,把验证的代码全部去除掉,List,Stack,Queue的效率和array是一样的;另外,Hash和Dictionary不是基于数组的,是用Object实现的,在进行键值操作时效率是最高的.

#3楼    回复  引用  查看    

2007-04-26 17:49 by Jeffrey Zhao      
使用JS这种弱类型进行开发的话,范型只在Debug版下面有意义哎,产品上就不需要范型乐。

#4楼 [楼主]   回复  引用  查看    

2007-04-26 17:54 by 沧桑雨迢迢      
恩~~~

#5楼    回复  引用  查看    

2007-04-27 10:37 by qqhe325      
UUID()产生的字符串有什么用啊

#6楼 [楼主]   回复  引用  查看    

2007-04-27 10:45 by 沧桑雨迢迢      
你注意到这一点,看来是看了源代码的 :)
这是我实现Dictionary是用到的,因为Dictionary是基于Object实现的,而Object[key]后,系统会自动吧key改成String类型...这样,如果我var ds = new Dictionary(MyClass,String)()这样的功能就实现不了.所以我需要一个技巧来改变这点,需要一个唯一性的标志符, 代替真实的Key对象作为Key,所以使用UUID()了.
因此,除了Number和String作为Key时性能没有任何多余的开销外,当你使用自定义类型或其他类型作为Key时,需要一点生成UUID()的开销 不过,基本上60%~70%使用Dictionary时,都是以String作为Key的,不需要多担心 :)

#7楼 [楼主]   回复  引用  查看    

2007-04-27 10:49 by 沧桑雨迢迢      
因为这个问题,Object[key] = value之后,将key统一变化成String,死了我不少脑细胞...和一些网友讨论之后,找到了UUID这个解决方案...

#8楼    回复  引用  查看    

2007-04-27 11:03 by 装配脑袋      
UUID是具有等价特性的吗?比如说两个变量都等于1.5,那他们的UUID一定相等吗?

#9楼    回复  引用    

2007-04-27 11:07 by webreport [未注册用户]
下载研究一下看看能不能用上. ( 支持动态列的纯.net写的web报表开发工具在: http://www.fcsoft.com.cn/webreport.htm )

#10楼    回复  引用  查看    

2007-04-27 12:36 by 斧头帮少帮主      
下完之后不会配置....

#11楼 [楼主]   回复  引用  查看    

2007-04-27 13:37 by 沧桑雨迢迢      
不需要配置...你只要把几个js文件引用进你开发的页面即可...

#12楼    回复  引用    

2008-04-21 18:45 by azheng [未注册用户]
ArrayList 存进去是User类型 取出来就变Object了,属性方法全没了

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-26 17:36 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: