`
hehoha_wj
  • 浏览: 4489 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

利用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>

分享到:
评论
19 楼 superobin 2010-12-10  
正常的大家都写了。。我乱写个递归的。。嘿嘿,原理是一样的
var ary = [1,1,1,1,1,1,2,32,,1,1,1,1,1,213,14,3,25,,,,51512,,"fasfasfsa",null,NaN,1,function(){},function(){},function(){},{},{},[],"fasfasfsa"];
(function(index) {
	index = index||0;
	for(var i=index+1;i<ary.length;i++) {
		if(ary[i] === ary[index]) {
			ary = ary.slice(0,i).concat(ary.slice(i--+1));
		}
	}
	if(ary.length-index>1) {
		arguments.callee(index+1);
	}
})();
18 楼 goolcona 2010-12-07  
(function($) {

$.extend($, {

arrunique : function(array) {
var ret = [], done = {};
try {
for (var i = 0, length = array.length; i < length; i++) {
var tmp = array[i];
if (!done[tmp]) {
done[tmp] = true;
ret.push(tmp);
}
}
} catch (e) {
ret = array;
}
return ret;
}

});

})(jQuery);

jQuery本身有一个工具方法 jQuery.unique(array),但是在1.3的时候对于纯粹的数组去重有些问题,上面的代码改了源码一点。
17 楼 dagmom 2010-12-06  
hyj1254 写道
var array=[false,undefined,null];
alert(array);

引用
false后面的项全部丢失




不好意思,我上的一段代码里面看错了,把===写成了==,呵呵!
16 楼 hyj1254 2010-12-06  
var array=[false,undefined,null];
alert(array);

引用
false后面的项全部丢失


15 楼 dagmom 2010-12-06  
cai3178940 写道
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);

嗯,的确是这么回事,之前没注意,谢谢楼上


false后面的项全部丢失,求解?
14 楼 hyj1254 2010-12-06  
引用
但是在for(var y in newArry)这样遍历的时候,多出了indeOf和另外一个

这个应该是把prototype中的属性或方法给读出来了。参考下前面的讨论。
13 楼 Jwind 2010-12-05  
hyj1254 写道
我也来一个:
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);
}

这种方法,我也用过,但是在for(var y in newArry)这样遍历的时候,多出了indeOf和另外一个(忘记是什么了),不知道是什么原因,当时没太去管,谁能解释一下?
12 楼 smzd 2010-12-03  
好像一些方法的调用都是不用时间的,所以不会被记录在O(n)中,比如说Array.splice……
11 楼 hyj1254 2010-12-03  
[{a:1}, {b:1}, "[object Object]"]

这个确实是,都成[object Object]了。
10 楼 clue 2010-12-03  
hyj1254 写道

结论:
这种写法也能处理除字符串外的其他数据。。
也没有破坏顺序。
但最后一条确实是那样的,会枚举原型链属性,需要使用hasOwnProperty。

试试这个就知道了: [{a:1}, {b:1}, "[object Object]"]
9 楼 clue 2010-12-03  
引用
楼上的程序也只能处理字符串,并且破坏了顺序
另外for in循环比较危险,它会枚举原型链上的属性

按楼上所述试验了一把:

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

----------------------------
回复出了问题,被截断了,见后面重发的回帖
8 楼 cai3178940 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);

嗯,的确是这么回事,之前没注意,谢谢楼上
7 楼 hyj1254 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);
6 楼 cai3178940 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);
5 楼 cai3178940 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);

4 楼 hyj1254 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。
3 楼 hehoha_wj 2010-12-03  
人多力量大啊,谢谢兄弟们,可以提供这么多解决方法。三楼的方法好,关键我以前不知道hasOwnProperty这个东西,学习了。
2 楼 clue 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 楼 hyj1254 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);
}

相关推荐

    JS去除数组重复值的五种不同方法

    在JavaScript中,去除数组中的重复值是一个常见的需求。数组去重可以提升数据处理的效率,尤其是在进行数据统计、比较时。以下介绍几种在JavaScript中去除数组重复值的方法。 ### 方法一:使用indexOf() 这种方法...

    javascript中去除数组重复元素的实现方法【实例】

    Set对象是一种集合结构,它不允许存储重复的值,可以很方便地去除数组中的重复项。 使用Set对象去除数组中的重复元素的示例代码如下: ```javascript var originalArray = [1, 2, 3, 4, 1, 4, 1, 3]; var ...

    第 33 题:如何去掉一组整型数组重复的值?.doc

    给定一个整型数组,如何去掉其中的重复值?例如,数组 `[20, 28, 28, 30, 28, 50, 40]` 中有多个重复的值 `28`,如何将其去掉? 解决方法 要解决这个问题,我们可以使用 ES6 中新增的数据结构 `Set`。`Set` 是一种...

    javascript过滤数组重复元素的实现方法

    随着ES6(ECMAScript 2015)的引入,JavaScript新增了许多功能强大的方法,其中包括利用`Set`对象来快速去除数组中的重复元素。`Set`对象是一种新的数据结构,它只存储唯一值。示例代码如下: ```javascript ...

    JS简单去除数组中重复项的方法

    在提供的代码示例中,我们有一个数组`arr = ["aaa", "bbb", "aaa", "ccc", "ddd", "ccc"]`,调用`unique(arr)`后,会得到一个新的数组`["aaa", "bbb", "ccc", "ddd"]`,其中去除了重复的元素。 这种方法的优点在于...

    js数组相减简单示例【删除a数组所有与b数组相同元素】

    在JavaScript中,数组相减并不是一个内建的数组操作方法,所以我们需要自定义函数来实现这个功能。其核心思想是,遍历数组b中的每一个元素,再分别在数组a中查找是否有与之相同的元素,如果找到,则将这个元素从数组...

    js代码-编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

    另一方面,`reduce()`方法可以将数组的每个元素与前一个元素的累积结果相结合,我们可以利用这个特性来创建一个新的单一数组。 一个使用`reduce()`的扁平化数组的例子如下: ```javascript function flatten(arr) ...

    LeetCode去除数组重复元素-leetcode_[removed]刷题

    编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串 ""。 Valid Parentheses(有效的括号) 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串...

    js代码-//已知如下数组: //编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

    在JavaScript编程中,数组的扁平化和去除重复元素是常见的操作,特别是在处理嵌套数组或者需要优化数据结构时。本篇文章将详细讲解如何通过JavaScript实现这个功能,并创建一个能够将数组扁平化、去重并排序的程序。...

    JavaScript去掉数组中的重复元素

    下面我们就用js的特性,编写一个高效去除数组重复元素的方法。 代码如下: [removed] function unique(data){ data = data || []; var a = {}; for (var i=0; i&lt;data.length; i++) { var v = data[i]; if (typeof...

    js 高效去除数组重复元素示例代码

    本文介绍的是一种高效的去除数组中重复元素的示例代码,通过编写一个名为unique的函数,我们可以在JavaScript中方便地去除数组元素的重复项。 在示例代码中,unique函数通过以下步骤实现数组去重: 1. 首先检查...

    JavaScript 数组去重并统计重复元素出现的次数实例

    在JavaScript编程中,处理数组去重是一个常见需求,而能统计重复次数则增加了数据处理的深度。为达到这一目的,文章提供了两种方法:一种是通过基本的数组操作来实现去重和计数;另一种是利用ES6新增的Set对象来简化...

    javascript数组去重方法分析

    1. **在线去除重复项工具**:[http://tools.jb51.net/code/quchong](http://tools.jb51.net/code/quchong) 2. **在线文本去重复工具**:[http://tools.jb51.net/aideddesign/txt_quchong]...

    Javascript 更新 JavaScript 数组的 uniq 方法

    在JavaScript中,原生并没有提供直接去除数组重复项的方法。因此,开发者通常需要自己编写函数来实现这一功能。一个典型的例子就是实现数组的`uniq`方法,该方法能够返回一个新数组,其中包含了原始数组的所有非重复...

    JS数组去掉重复数据只保留一条的实现代码

    JavaScript数组本身没有提供去除重复元素的方法,因此,我们需要编写代码实现这一功能。接下来,我们将详细探讨几种不同的实现方式,包括基本的遍历方法、使用哈希表优化的方法,以及一些可能遇到的特殊情况处理。 ...

    JavaScript实现删除数组重复元素的5种常用高效算法总结

    在JavaScript中,数组去重是一个常见的需求,尤其是在处理数据时,为了提高数据处理的准确性与效率,去除数组中的重复元素是非常必要的。本篇总结了5种常用且高效的算法来实现数组去重,并在实现过程中结合实例详细...

Global site tag (gtag.js) - Google Analytics