论坛首页 Web前端技术论坛

利用javascript编写一个去除数组重复项的方法

浏览 11714 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-03   最后修改:2010-12-03

利用javascript编写一个去除数组重复项的方法,时间复杂度O(n),大家看看有没有什么漏洞或者写出自己更好的方法

<html>
 <head>
  <script type="text/javascript">
   function distinct(arr){
    var rs = new Array();
    for(var i=0;i<arr.length;i++){
     var s = ","+rs.join(",")+",";
     if(!s.match(","+arr[i]+",")){
      rs.push(arr[i]);
     } 
    }
    return rs;
   }
   var r = new Array(1,2,212,2);
   alert(distinct(r).toString());
  </script>
 </head>
 <body>
 </body>
</html>

   发表时间:2010-12-03  
我也来一个:
var array=[1,1,2,2,3,3];
var newArry=[];
for(var x in array){
 newArry[array[x]]="";
}
for(var y in newArry){
alert(y);
}
0 请登录后投票
   发表时间:2010-12-03   最后修改:2010-12-03
楼主的程序只能处理不含","的字符串,并且用正则匹配效率会比较低吧?
时间复杂度也不应该算O(n),因为随着rs的增长,要匹配搜索的字符串也在增长。

楼上的程序也只能处理字符串,并且破坏了顺序
另外for in循环比较危险,它会枚举原型链上的属性

如果数组中只有字符串的话,还是比较容易处理的:
var s = ["a","b","a","c"];
var arr = [], map = {}, n, i;
for(i=0; i<s.length; i++){
    n = s[i];
    if(!map.hasOwnProperty(n)){
        map[n] = true;
        arr.push(n);
    }
}
console.log(arr);
1 请登录后投票
   发表时间:2010-12-03  
人多力量大啊,谢谢兄弟们,可以提供这么多解决方法。三楼的方法好,关键我以前不知道hasOwnProperty这个东西,学习了。
0 请登录后投票
   发表时间:2010-12-03  
引用
楼上的程序也只能处理字符串,并且破坏了顺序
另外for in循环比较危险,它会枚举原型链上的属性

按楼上所述试验了一把:
        Array.prototype.say="haha";
	var array=[new Object(),"1,2#<%^&*()+}[]{",2,2,3,3,4,4,6,6,5,5];
	var newArry=[];
	for(var x in array){
 		newArry[array[x]]="";
	}
	for(var y in newArry){
		alert(y+" "+typeof y);
	}

结论:
这种写法也能处理除字符串外的其他数据。。
也没有破坏顺序。
但最后一条确实是那样的,会枚举原型链属性,需要使用hasOwnProperty。
0 请登录后投票
   发表时间:2010-12-03  
来个简单点的

var array=["a","b","c","a"];
for(var i=0;i<array.length;i++){
    for(var j=i+1;j<array.length;j++){
       if(array[j]==array[i]) array.splice(j,1)
    }
}
alert(array);

0 请登录后投票
   发表时间:2010-12-03  
稍微改改,适合任何类型去重

var array=[2.3,2.3,"a","b","b",true,true,false,1,0,undefined,null];
for(var i=0;i<array.length;i++){
    for(var j=i+1;j<array.length;j++){
       if(array[j]===array[i]) array.splice(j,1)
    }
}
alert(array);
0 请登录后投票
   发表时间:2010-12-03  
楼上的方法不错,但最好修改下,呵呵:
var array=[2.3,2.3,"a","b","b",true,true,true,false,1,0,undefined,null];
for(var i=0;i<array.length;i++){
    for(var j=i+1;j<array.length;j++){
       if(array[j]===array[i]) {
           array.splice(j,1);
           j--;
         }
       
    }
}
alert(array);
0 请登录后投票
   发表时间:2010-12-03  
hyj1254 写道
楼上的方法不错,但最好修改下,呵呵:
var array=[2.3,2.3,"a","b","b",true,true,true,false,1,0,undefined,null];
for(var i=0;i<array.length;i++){
    for(var j=i+1;j<array.length;j++){
       if(array[j]===array[i]) {
           array.splice(j,1);
           j--;
         }
       
    }
}
alert(array);

嗯,的确是这么回事,之前没注意,谢谢楼上
0 请登录后投票
   发表时间:2010-12-03   最后修改:2010-12-03
引用
楼上的程序也只能处理字符串,并且破坏了顺序
另外for in循环比较危险,它会枚举原型链上的属性

按楼上所述试验了一把:

        Array.prototype.say="haha";
var array=[new Object(),"1,2#

----------------------------
回复出了问题,被截断了,见后面重发的回帖
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics