删除数组中的重复元素
功课的时候看到这个题目,写了几种解法。
一、注重可重用性。
Array.prototype.each=function(callback){
for(var i=0,ii=this.length;i<1*ii;i++)
{
callback.call(this,i,this[i]);
}
};
Array.prototype.makeunique=function()
{
var ret=[];
this.each(function(i,v){
var dup=[];
this.each(function(ii,vv){
if(i!=ii && v===vv){
dup.push(ii);
ret.push(vv);
}
});
var _this = this;
dup.each(function(i,v){
_this.splice(v-i,1);
});
});
this.ret = ret;
return this;
};
//测试
alert(['a','b','c','c','d','b','a','a','b','d'].makeunique());
alert(['a','b','c','c','d','b','a','a','b','d'].makeunique().ret);
二、注重实用,纯粹解题。
Array.prototype.distinct=function(){
var ret=[];
for(i=0,ii=this.length;i<1*ii;i++)
{
for(j=i+1;j<1*this.length;)
{
if(this[i]===this[j])
{
ret.push(this.splice(j,1)[0]);
}else{
j++;
}
}
}
this.ret=ret;
return this;
}
//测试
alert(['a','b','c','c','d','b','a','a','b','d'].distinct());
alert(['a','b','c','c','d','b','a','a','b','d'].distinct().ret);
三、我最喜欢的方法。
其实方法一和二的思想是一样的,只不过方法一封装了一个操作,不过导致代码可读性也降低了。方法三是一种全新的思路,代码简单,逻辑清晰,复杂度也最低,只需要一遍循环即可。
Array.prototype.makeUnique=function()
{
var a = [],
b = {},
ret = [];
for (var i=0,l=this.length;i < 1*l;i++)
{
if(!(this[i] in b))
{
a.push(this[i]);
b[this[i]]=this[i];
}
else
{
ret.push(this[i]);
}
}
a.ret = ret;
return a;
}
//测试
alert(['a','b','c','c','d','b','a','a','b','d'].makeUnique());
alert(['a','b','c','c','d','b','a','a','b','d'].makeUnique().ret);
方法一和方法二返回的ret数组顺序与方法三不同。
方法一和二返回的被删除元素列表打乱了数组本身的顺序。
方法三则保留了数组本身的顺序,因此无论从哪个方面来看,方法三都是最佳的选择。
标签: javascript
删除数组中的重复元素
http://hellohtml5.blogspot.com/2010/05/blog-post.html
2 条评论:
order tramadol overnight best place buy tramadol - tramadol xr
long term phentermine use phentermine online with prescription - phentermine 37.5 online prescription
发表评论