1.速度最快算法:对象键值对法(占用空间最多,空间换时间)
在使用此方法去除数组重复的元素时,我们应该注意,当判断js对象键时,会自动的对传入的键执行‘’toString()”,因此,我们需要考虑数组中可能同时出现number类型和字符串类型的数据,在这时,不同的键可能会被认为是一样,比如:a[2]和a["2"]。因此,解决这个问题还得使用indexOf方法。
function unique(arr){
var obj = {}, r = [], value, type;//f分别表示:键值对对象,存放过滤后数组,当前下标的数组值,数组值的数据类型
for (var i = 0; i < arr.length; i++) {
value= arr[i];//当前下标数组元素
type = typeof value;//该数组元素的类型
if (!obj[value]) {//在键值对中不存在该值
obj[value] = [type];//不存在就把该键值对以value:[type]的形式存入obj
r.push(value);//将该数组元素push到新数组中
} else if (obj[value].indexOf(type) < 0) {//解决不同键可能被认为一样的问题 例如obj['1']与obj[1],在前面!obj[value]会被判断为一样,因为判断时value会自动调用toSting转换为字符串,因此需要这个判断
obj[value].push(type);//将该值存入对应的value值的数组中
r.push(value);
}
}
return r;//返回去重复后的数组
}
测试代码:
var a=[8,2,1,'3',3,5,4,5,4];
console.log(unique(a));//[8,2,1,'3',3,5,4];
2.双重for循环,利用splice()方法去重复
在双重for循环中,外层循环元素,内层循环时比较值,如果值相同的时候,就用splice()方法去掉内层循环下标对应的值,然后再让内层循环的循环变量减减,以实现每个值都进行比较。
function unique2(arr){
for(var i=0;i<arr.length;i++){//控制循环元素
for(var j=i+1;j<arr.length;j++){//实现i和i+1后每个元素比较
if(arr[i]===arr[j]){//判断第i个元素和第j个元素是否相等 ,注意:这里用===表示数组元素值和类型都得相等
arr.splice(j,1);//去掉重复的元素
j--;//索引下标减1,达到所有元素都进行比较了
}
}
}
return arr;//返回去重复后的数组
}
测试代码:
b = [1, 2, 1, '3', 5, 3,'true',true,1,2,true];
console.log(unique2(b))//[1,2,'3',5,3,'true',true];
3.利用indexOf()方法去重复
新创建一个空数组,然后用for循环原数组,依次判断循环的每一个元素是否在新数组中,如果新数组中已存在,则跳过,否则将该元素push到新数组中,最后返回这个新数组。
function unique3(arr){
let array=[];//创建一个新数组
for(var i=0;i<arr.length;i++){//遍历原数组
if(array.indexOf(arr[i])==-1){//判断元素是否存在于array新数组中
array.push(arr[i]);//将满足条件元素添加到新数组中
}
}
return array;//返回新数组
}
测试代码:
var a = [1, 2, 1, '3', 5, 3,'true',true,1,2,true]
console.log(unique3(a))//[1,2,'3',5,3,'true',true];
4.利用sort()方法去重复 注意:这种方法只适用于纯数字(number)类型
首先利用sort()排序对原数组进行排序,然后创建一个新数组,再对排序后的数组进行遍历,对相邻的两个元素进行比较,如果相邻两个元素不相等,就将元素push进新数组中。
1)这是直接调用sort()方法,数组元素按字符串顺序对值进行排序后在去重复的形式
//这种方法是直接调用sort(),让数组按字符串顺序对值进行排序,输出结果不是安数字大小排序的
function unique4(arr){
arr=arr.sort();//直接调用sort方法排序
var array=[arr[0]];//将数组元素第一个添加到新数组中
for(var i=1;i<arr.length;i++){//从数组的第二个元素开始遍历
if(arr[i]!=arr[i-1]){//比较当前元素与前一个元素是否相等
array.push(arr[i])//不等就把值push到新数组中
}
}
return array;//返回新数组的值
}
测试代码:
var a = [1,3,43,5,6,74,5,1,2,3,4,5];
console.log(unique4(a)) //[1,2,3,4,43,5,6,74]
2)这是sort()方法调用了比值函数,对数组进行安数字大小升序排序后在去重复的形式
//这种方法会将数据先按数字大小的顺序升序排列,然后在判断,最后输出的结果会以升序排列
function unique4(arr){
arr=arr.sort(function(a,b){return a-b});//sort调用比值函数,将数组按升序排列
var array=[arr[0]];//将数组元素第一个添加到新数组中
for(var i=1;i<arr.length;i++){//从数组的第二个元素开始遍历
if(arr[i]!=arr[i-1]){//比较当前元素与前一个元素是否相等
array.push(arr[i])//不等就把值push到新数组中
}
}
return array;//返回新数组的值
}
测试代码:
var a = [1,3,43,5,6,74,5,1,2,3,4,5];
console.log(unique4(a))//[1,2,3,4,5,6,43,74]
这种方式不仅能去重复,还能将数组按升序排序。因此,如果数组是纯数字的时候,又希望数组去重复后结果按升序排序,可以用这种方法。