假设要去重的数组是比较简单的,例如:
这个数组只包含了数字,字符串两种类型。我们给数组原型上面添加去重的方法distinct,用第一种很容易想到的方法来实现,当然也是很笨很直接的,把这个数组复制一份然后循环两个数组,对比当前值与后面所有的值是否相等,如果与后面所有值都不等则把该值存到新数组里,如此最后再返回该新数组。
方法如下:
//第一种方法
Array.prototype.distinct=function(){
var clone,newArr=[],n=0;
if(this.length<2)return;
clone=this;
for(var i=0,len=this.length;i<len;i++){
for(var j=i+1,len2=clone.length;j<len2;j++){
if(this[i]!==clone[j]){
n++;
}
}
if(n==(len-i-1)){
newArr.push(this[i])
}
n=0;
}
return newArr;
}
console.log([1,2,2,3,'5',6,5,'',' '].distinct());
/*获得被check的radio的值*/
function GetRadioValue(RadioName){
var obj;
obj=document.getElementsByName(RadioName);
if(obj!=null){
var i;
for(i=0;i<obj.length;i++){
if(obj[i].checked){
return obj[i].value;
}
}
}
return null;
}
/*设置被选中属性*/
function SetRadioCheck(RadioName,i){
var obj;
obj=document.getElementsByName(RadioName);
obj[i].setAttribute("checked","checked");
}
如果数组很长,按这样的方法遍历,数组长度为n,那么时间复杂度为n*n。显然该方法性能还有待提升。
第二种方法,数组排序,在排序的过程去除重复的值。
这样代码看起来似乎短了很多,甚至连一个for循环都没有,但是sort得效率也高不到哪里去。
第三种实现方法,用到的对象属性不会重名的原理。
第三种方法运行看下结果,会发现跟上面的方法实现的结果不一致,细看原来它把数字5和字符串5当成重复的值给去掉了。看来类型必须保存起来然后再判断是否相等,这样便有了下面的第三种方法的补充版。
以上的例子有些简单,来个更复杂的类型,进行测试看看:
发现{a:'vc'},{},{a:'vv'}这些不同的对象还是会被剔除掉,如果数组里面有对象则要继续遍历对象里面的属性和值,继续第三种方法的加强
就介绍这些了,希望对大家有所帮助。
学脚本,就来脚本学堂。祝大家学习进步。