1.概述
在平时的做题和有些面试过程中会经常碰到一些数组去重的问题,这是一个很重要的东西。以下是我总结的一些关于数组去重的方法;
2.方法
2.1 方法一(es6)
[...new Set([1,2,3,4,1,2,5,3,7,'1'])]
2.2 方法二(排序后进行去重)
我们碰到的数组大部分都是乱序的,如果这个数组是有序排列的话就可以直接判断相邻的两个元素是否相等即可;我们所要做的主要内容就是将数组排序,数组中的sort()方法可将数组排序,默认情况下是按照ASCII进行升序。排序后直接判断即可,代码如下:
// 先排序,在进行去重
function unique1(arr) {
arr=arr.sort(); //对数组进行重新排序
console.log(arr);
var arr1=[];
for(var i=0;i<arr.length;i++){
if(arr[i]!==arr[i+1]){ // 如果当前元素与下一个元素不相等,则放入新数组中
arr1.push(arr[i]);
}
}
return arr1;
}
var arr=[0,8,32,5,10,5,4,8,4,0];
console.log(unique1(arr)); // [0, 10, 32, 4, 5, 8]
2.3 方法三(利用数组的 indexOf()方法)
数组的indexOf()方法,该方法可以检索元素首次出现在数组中的位置,如果该数组中不存在此元素则返回-1;例:arr[1,5,9,0,1,5] arr.indexOf(5) 返回值为1; arr.indexOf(10) 返回值为-1;我们可以利用这个特性,对数组进行去重;
// 利用数组方法
function unique2(arr) {
var arr1=[]; // 存放新的数组
for(var i in arr){
if(arr1.indexOf(arr[i])==-1){ // 如果arr1中没有该数据,则将数据放入
arr1.push(arr[i])
}
}
return arr1; // [0, 8, 32, 5, 10, 4]
}
var arr=[0,8,32,5,10,5,4,8,4,0];
console.log(unique2(arr)); // [0, 8, 32, 5, 10, 4]
2.4方法四(利用对象与数组的结合)
此方法利用给对象的添加属性,并给响应对象赋值的方式,去判断当前属性是不是有值的存在;初次状态下定义一个空对象,遍历整个数组,将数组中每一个元素作为该对象的属性,开始时没有值,将当前数据放到一个新数组中,并将这个属性赋为1,在在遍历过程中如果遇到有值的属性,直接跳过;该方法有较好的
// 数组对象的方法
function unique1(arr){
let temp=[]; // 接收不重复的数组
let obj={};
for(let i in arr){ // 遍历数组
if(!obj[arr[i]]){ // 取出obj对象中属性为arr[i]的值,如果不存在这个值,就将当前arr[i]放入temp中
temp.push(arr[i]);
obj[arr[i]]=1; // 将当前的属性为arr[i]的值赋为1,下次碰到相同的属性的将不会进入此语句中
}
}
return temp;
}
let arr=[0,1,1,2,3,5,6,0,3,5,2];
console.log(unique3(arr))
2.5方法五(利用ES6中的set)
ES6中的set方法能够对放入其中的元素进行过滤,将不重复的元素放入set中
// es6 set方法
let arr=[0,8,32,5,10,5,4,8,4,0];
function unique4(arr) {
let set=new Set();
arr.forEach(val=>{
set.add(val)
});
set = Array.from(set);
return set;
}
console.log(unique4(arr)); // [0, 8, 32, 5, 10, 4]
2.6 方法六(使用arr.reduce()和includes())
let arr = [1,2,3,4,1,2,4,5,3];
let newArr = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur);
}else {
return pre;
}
},[]);
console.log(newArr) // [1,2,3,4,5]