精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-03
最后修改:2010-12-03
利用javascript编写一个去除数组重复项的方法,时间复杂度O(n),大家看看有没有什么漏洞或者写出自己更好的方法 <html> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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); } |
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |
发表时间:2010-12-03
人多力量大啊,谢谢兄弟们,可以提供这么多解决方法。三楼的方法好,关键我以前不知道hasOwnProperty这个东西,学习了。
|
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |
发表时间: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); 嗯,的确是这么回事,之前没注意,谢谢楼上 |
|
返回顶楼 | |
发表时间:2010-12-03
最后修改:2010-12-03
引用 楼上的程序也只能处理字符串,并且破坏了顺序
另外for in循环比较危险,它会枚举原型链上的属性 按楼上所述试验了一把: Array.prototype.say="haha"; var array=[new Object(),"1,2# ---------------------------- 回复出了问题,被截断了,见后面重发的回帖 |
|
返回顶楼 | |