技术开发 频道

用Javascript模拟Java的Set

【IT168技术文档】

最近写AJAX的应用遇到很多需要丰富的Javascript集合的地方,可惜javascript没有Java的Collection那么强大的集合类,于是打算自己尝试写一个模拟Set的API,结果写出来的模拟类和Set有点不同,有一个优势--可以有序取单个对象,但也有一个劣势,就是删除单个对象需要遍历该集合,由于我的应用不大可能用到单个删除,所以我暂时还没有想到一种数据结构可以实现不遍历的单个对象删除,又能满足现有的API都高效完成,如果谁有更好的代码来实现请回复

目前想到可以实现的方法:

add(o); addAll(array) contain(o); getint); getAll(); sort(comparator); //传进去的是一个fn,还没有写例子.... size(); remove(); reverse();

基本数据结构是两个数组,一个是index数组,数组下标连续,用来存放第二个数组的下标,另一个是存放对象的数组,不连续,下标是对象的id或者对象中其他任何可以转换成唯一Integer的Field(Set也要求放进去的对象必须要有hashCode嘛,不然没法区别第一个和第二个)

实现的API:

function Collection(){ this.chain=new Array(); this.table=new Array(); } Collection.prototype.get=function(i){ return this.table[this.chain[i]]; } Collection.prototype.add=function(o){ this.table[o.id]=o; this.chain.push(o.id); } Collection.prototype.addAll=function(array){ for(var _i=0;_i<array.length;_i++){ this.add(array[_i]); } } Collection.prototype.contain=function(o){ if(this.table[o.id]){ return true; }else{ return false; } } Collection.prototype.getAll=function(){ tempList=new Array(); for(var _i=0;_i<this.chain.length;_i++){ tempList.push(this.table[this.chain[_i]]); } return tempList; } Collection.prototype.sort=function(comparator){ this.chain.sort(comparator); } Collection.prototype.remove=function(o){ var _var = this.chain; for(var _i=0;i<this.chain.length;i++){ if(this.table[this.chain[_i]].id==o.id){ this.table[this.chain[_i]]=null; this.chain.splice(_i,1); return; } } } Collection.prototype.size=function(){ return this.chain.length; } Collection.prototype.reverse=function(){ this.chain.reverse(); }


目前还有一个addAll方法也是暂时没有想到有什么不用遍历的好的实现

0
相关文章