`
yiminghe
  • 浏览: 1453228 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数组去重问题

阅读更多

很经典的问题,去除数组中的重复元素,上网搜了一下,发现大多数无论转载还是原创都是这个解法:


错误解法:

function uniq(array) {
	var map={};
	var re=[];
	for(var i=0,l=array.length;i<l;i++) {
		if(typeof map[array[i]] == "undefined"){
			map[array[i]]=1;
			re.push(array[i]);
		}
	}
	return re;
}

 

如果用过java等高级语言的话,初看这段代码确实没有什么问题:下面的例子:

 

uniq([1,2,1,2,4]);

 

也能正常运行。



可再试试下面的例子:

 

uniq([{x:1},"[object Object]"]);
uniq([{x:1},{z:2}]);
 

运行一下就会知道错在哪里了!

 

HashMap In Java :

 

在 java 中如 HashMap 类可以使用对象做为 key (内部实现使用 hashcode散列到桶 以及桶内equals[默认内存地址]比较),如:

 

class Holder {
	int i;
}
public class Test3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HashMap<Holder, Holder> map=new HashMap<Holder, Holder>();
		Holder key= new Holder();
		Holder value= new Holder();
		value.i=1;
		map.put(key, value);
		Holder key2=new Holder(); 
		System.out.println(map.get(key).i);
		System.out.println(map.get(key2));
	}

}

 

 

Object In Javascript:

 

而在 javascript 中毕竟没有map,只有对象这个概念,而对象则要求其属性值必须为字符串,如果提供给对象的属性不是字符串,那么则会自动调用 toString 方法转化为字符串形式,例如:

 

var x={};
var y={
    toString:function(){
        return "z";
     }
};

x[y]=1;
alert(x["z"]);

那么由上述例子就可以知道第一个程序为什么是错误的了 。

 

正确答案:

 

我们无法利用高级语言提供的map类库,那就只好两遍遍历数组了,也是 taobao ued提供的标准答案:


注意 === 使用。

 

/**
*unique the array
*@param {Array} array array to unique
*@return {Array} uniqued array ,note change parameter
*/
function undulpicate(array){
	for(var i=0;i<array.length;i++) {
		for(var j=i+1;j<array.length;j++) {
			//注意 ===
			if(array[i]===array[j]) {
				array.splice(j,1);
				j--;
			}
		}
	}
	return array;
}
 

 

ps: Jquery Uniq Node


如果我们确认数组里每个元素都是对象,那么可以用加标签的方式,给对象元素添加标签,从而把时间复杂度提升到 O(n) :

var x={z:1};
var y={q:2};
function uniqObjects(array){
	var re=[];
	for(var i=0,l=array.length;i<l;i++) {
		if(typeof array[i]["_uniqObjects"] == "undefined"){
			//添加标签
                        array[i]["_uniqObjects"]=1;
			re.push(array[i]);
		}
	}
        //取出标签
	for(var i=0,l=re.length;i<l;i++) {
		delete re[i]["_uniqObjects"];
	}
	return re;
}
uniqObjects([x,y,x]);

 

这也正是 jquery 的思路,由于每个元素都是节点数组,当然可以这样做了:

 

unique: function( array ) {
		var ret = [], done = {};

		try {

			for ( var i = 0, length = array.length; i < length; i++ ) {
				var id = jQuery.data( array[ i ] );

				if ( !done[ id ] ) {
					done[ id ] = true;
					ret.push( array[ i ] );
				}
			}

		} catch( e ) {
			ret = array;
		}

		return ret;
	},
 

 

注意:对基本类型,如 number,string,不要使用这种方式,它们会产生临时对象,并不能达到预期效果!




 

 

1
0
分享到:
评论
4 楼 binyan17 2011-06-29  
很好,学习了!!
3 楼 yiminghe 2010-01-20  
xiongzhijian51 写道
评论没法改,囧.

var re =  undulpicate([{x:1},{x:1}]);
console.log(re);

楼主可以运行下上面的代码.


对象之间相等的定义是 : 是否指向同一对象
{x:1} != {x:1}
基本概念要清楚,看看比较的定义先
2 楼 xiongzhijian51 2010-01-20  
评论没法改,囧.

var re =  undulpicate([{x:1},{x:1}]);
console.log(re);

楼主可以运行下上面的代码.
1 楼 xiongzhijian51 2010-01-20  

var re =  undulpicate([{x:1},{z:1}]);
console.log(re);


[img]
>>> function undulpicate(array){ for(var i=0;i<...e = undulpicate([{x:1},{z:1}]); console.log(re);
[Object x=1, Object z=1]
[/img]

相关推荐

    JavaScript数组去重功能的设计与实现.pdf

    然后,文章提出了四种解决JavaScript数组去重问题的方法,并对每种方法进行了详细的分析和实现。 JavaScript简介 JavaScript是一种轻量级的脚本语言,由Oracle公司注册的商标。JavaScript主要包括ECMAScript、DOM...

    php数组去重和js数组去重最简方法

    本文将深入探讨这两种语言中实现数组去重的最简洁方法。 首先,让我们关注PHP的二维数组去重。在PHP中,数组去重通常涉及`array_unique`函数,但这个函数适用于一维数组,对于二维数组,我们需要自定义方法。一种...

    【源代码】C++算法(五)一维数组去重(复杂度为n且不新开辟空间)

    数组去重算法的效率关键在于它只遍历数组一次,因此时间复杂度为O(n)。由于不涉及额外的内存分配,空间复杂度为O(1)。这种原地修改的方法在处理大型数据集时尤其有用,因为它避免了因内存不足而导致的问题。 此外,...

    数组的去重、虑空

    简单的数组去重、虑空小工具。源码只是接受一个数组,把重复的,和空格去掉

    【JavaScript源代码】JavaScript数组去重问题的深入研究.docx

    数组去重是在处理大量数据时经常遇到的问题之一。为了提高程序效率以及代码的可读性和维护性,掌握多种不同的数组去重方法至关重要。 #### 最初的方法:双层循环 最初的想法通常是从最直观的方式开始——使用双层...

    JavaScript Array数组去重源码下载

    JavaScript Array数组去重源码下载

    一个数组去重的小程序

    这是一个简单的小程序,主要解决的是去除数组中的重复元素并输出去除重复元素并排序后的数组。

    JS实现数组去重方法总结(六种方法)

    标题中提到的是“JS实现数组去重方法总结”,描述中说明了文章将介绍六种方法,并提到...在面试中遇到数组去重问题时,可以根据上述方法回答,并结合具体场景说明每种方法的优缺点,这样可以更好地展示自己的专业知识。

    javascript实现数组去重的多种方法_.docx

    javascript 实现数组去重的多种方法_ javascript 实现数组去重的多种方法是指使用javascript 语言实现数组去重的多种方法。数组去重是指将数组中重复的元素删除,得到一个没有重复元素的新数组。下面将介绍多种实现...

    C#合并一维字符串数组并去重

    在处理数据时,我们经常需要对一维数组进行操作,例如合并和去重。本文将深入探讨如何在C#中实现这些功能,以及一些可能遇到的挑战和解决策略。 首先,让我们来看看如何合并一维字符串数组。在C#中,我们可以使用`...

    两种简单的数组去重方式推荐

    两个简单的数组去重方式,一个是indexOf和push方法结合数组去重,另一个是ES6中的Set对象实现数组去重,后者代码量少一些

    基础的、简单的JavaScript数组去重问题

    实际当中经常会遇到数组重复值的问题,这是最为基础的方法,利用indexOf或for循环去除数组中重复值

    高性能js数组去重(12种方法,史上最全)

    数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看。 在真实的项目中碰到的数组去重,一般都是...

    PHP实现的多维数组去重操作示例

    最近用到了一个获取历史会议列表的问题,需要去这个多维数组去重后返回返回给客户端,这里使用了几个php的组装函数,分享下,示例代码如下: &lt;?php $str = '{ "status": 0, "result": [ { "hostName": "杨新...

    前端基础数组、对象数组去重demo

    前端基础数组、对象数组去重demo

    javascript实现数组去重的方法

    数组去重是面试中经常被问到的热点问题,数组去重的方法有很多,下面谈谈个人理解。 概括 数组去重是一个比较常见的算法考察点,实现去重的方式无非就是唯一性或者非唯一性,简而言之,就是选出唯一的或者去掉不唯一...

    数组去重.zip

    在JavaScript编程中,数组去重是一项常见的操作,尤其是在处理数据集合时。数组去重的目的是消除重复元素,确保数组中的每个元素都是唯一的。本篇将深入探讨JavaScript中实现数组去重的各种方法,以及它们的优缺点。...

    JavaScript数组去重的方法总结【12种方法,号称史上最全】

    本文实例总结了JavaScript数组去重的方法。分享给大家供大家参考,具体如下: 数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的...

    js数组去重的方法汇总

    在JavaScript中处理数组去重问题是前端开发中经常遇到的一个场景。因为JavaScript数组中可以存储各种类型的值,包括基本类型值和对象引用,所以可能会因为数组中存在重复元素而导致数据处理上的不便。本文将详细介绍...

    数组去重Java工具类

    数组去重Java工具类

Global site tag (gtag.js) - Google Analytics