数组去重,首先要明确数组里面每一项的数据类型,如果是同类型的数据,那就会简单很多了,最头疼的还是遇到数组里有对象的情况。下面分成3种情况来实现吧。
(1)数组里面都是同一类型的,例如number,string,array,但不是object
function clear(arr){
var temp={},result=[];
for(var i=0;i<arr.length;i++){
if(!temp[arr[i]]){
result.push(arr[i]);
temp[arr[i]]=true;
}
}
return result;
}
这里的做法是新建一个temp对象,遍历数组,没遍历一次给对象temp添加一个属性,属性名是给数组那一项的值,再给它的属性值设为true,下一次遍历的时候遇到这个属性对应的属性值为true时,则代表数组中之前有相同的数据。
(2)数组中的数据类型不定,但是没object
function clear2(arr){
var temp={},result=[];
for(var i in arr){
/*i为arr的index,不是具体的值,如果是对象,则为对象的属性名*/
if(!temp[typeof(arr[i])+arr[i]]){
result.push(arr[i]);
//给对象temp中添加属性名为arr[i]的类型和arr[i]值的属性,防止搞混
temp[typeof(arr[i])+arr[i]] = true;
}
}
return result;
}
这个和上面的区别是,给对象添加属性的属性名除了数组的值还加上的类型
(3)数组中有对象
方法一:用递归方法,当对象中有属性是对象的时候,调用当前方法。这个是我从网上看来的,以下的解释大部分是我的猜想。
先写一个判断两个值是不是相等的方法
function isEqual(obj1,obj2){
/*是string和number,undefined,的情况*/
if(obj1===obj2){
return true;
}
/*不是对象或者为空的情况*/
if(!(obj2 instanceof Object) || (obj2===null)){
return false;
}
var p=0;
for(k in obj1){
p++;
var o1 = obj1[k],
o2 = obj2[k];
if((o1!=null)&&!isEqual(o1,o2)){
return false;
}
}
/*判断两个对象中的属性对是不是一样的*/
for(var k in obj2){
p--;
}
return p==0;
}
如果有一个(这里是obj2)不是对象,则返回false,因为两个都不是对象的且相等的话第一步就直接return true了;如果obj2是对象,但是obj1不是对象,那么关于obj1的for循环就不会执行,obj2的循环执行了,那样就会出现p的值不一样,但是如果obj2是空对象的话,p值还是等于0,这种还没测试过;如果两个都是对象,那么就进行比较了。
数组去重函数,调用了isEqual
function clear4(arr){
var temp=[arr[0]];
out: for(var i=0;i<arr.length;i++){
for(var j=0;j<temp.length;j++){
if(isEqual2(arr[i],temp[j])){
continue out;
}
}
temp.push(arr[i]);
}
return temp;
}
新建一个数组temp,里面有一个数组就是arr[0],然后将arr里面的数据和temp里面的比较,如果有相同的就进行下一次的循环,没有相同的就添加到temp里。
方法二:将对象变成字符串的形式再比较,这里主要是修改isEqual方法
先写对象变成字符串方法
function objtostr(obj){
var temp = [];
for(var i in obj){
temp.push(i);
temp.push(obj[i]);
}
return temp.join('');
}
将isEqual方法写成
function isEqual2(obj1,obj2){
if(obj1===obj2){
return true;
}
if((obj1 instanceof Object) && (obj2 instanceof Object)){
return objtostr(obj1) === objtostr(obj2);
}
return false;
}
感觉还是根据需求来决定用哪种方法,即便都是对象也不必一定非得比较完对象里的所有属性,可以挑出具有唯一性的比较
分享到:
相关推荐
JavaScript数组去重的几种方法数组去重的几种方法新建数组法同一个数组删除法利用object/map/set去重法先排序再移除法Filter与indexO
JavaScript数组去重功能的设计与实现.pdf
【JavaScript源代码】JavaScript数组去重问题的深入研究.docx
javascript数组去重小结_.docx
JavaScript Array数组去重源码下载
本文实例总结了JavaScript数组去重的方法。分享给大家供大家参考,具体如下: 数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的...
下面小编就为大家分享一篇JavaScript 数组去重并统计重复元素出现的次数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
javascript数组去重是一个比较常见的需求,解决方法也有很多种,网上都可以找到答案的,下面小编给大家整理了一份关于同类型的数组去重的方法,先给大家介绍下简单实现思路。 思路: 遍历数组,一一比较,比较到相同...
本篇文章主要介绍了JavaScript数组去重的6个方法。具有一定的参考价值,下面跟着小编一起来看下吧
本文实例讲述了javascript数组去重方法。分享给大家供大家参考,具体如下: 方法一. 思路:创建一个新的空数组,循环遍历旧数组,用indexOf()方法,可以取得元素在数组中的位置,如果值为-1表示不存在。那么新数组用...
Javascript 数组去重的四种方法 四种算法来实现这个目的: 第一种方法: Array.prototype.unique1 = function () { var n = []; //一个新的临时数组 for (var i = 0; i < this.length; i++) //遍历当前数组 {...
主要给大家介绍了关于JavaScript数组去重的几种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用JavaScript具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
JavaScript数组去重是前端面试酷爱的问题,问题简单而又能看出程序员对计算机程序执行过程的理解如何。数组去重的方法有很多,到底哪种是最理想的我不清楚。于是我测试了下数组去重的效率。测试二十万个数据,随着...
JavaScript 数组去重!!
javascript实现数组去重的多种方法_.docx
数组去重是面试中经常被问到的热点问题,数组去重的方法有很多,下面谈谈个人理解。 概括 数组去重是一个比较常见的算法考察点,实现去重的方式无非就是唯一性或者非唯一性,简而言之,就是选出唯一的或者去掉不唯一...
实际当中经常会遇到数组重复值的问题,这是最为基础的方法,利用indexOf或for循环去除数组中重复值
JavaScript数组去重经常出现在前端招聘的笔试题里,比如:有数组vararr=['a','b','c','1',0,'c',1,'',1,0],请用JavaScript实现去重函数unqiue,使得unique(arr)返回['a','b','c','1',0,1,'']1.正确。别小看这个考点...