(一)基于ES6中的Set方法
let ary = [12,23,12,15,25,23,25,14,16];
ary = [...new Set(ary)];
console.log(ary); //[12, 23, 15, 25, 14, 16]
(二)基于对象处理
/*
unique:实现数组去重的方法
参数:ary[Array] 要去重的数组
返回值:[Array] 去重后的数组
*/
function unique(ary){
//1.创建一个空对象
let obj = {};
//2.循环数组中的每一项,把每一项向对象中进行存储 ==> item:item
for(let i = 0;i < ary.length;i++){
let item = ary[i];
//3.每一次存储之前进行判断:验证obj中是否存在这一项
if(obj[item] !== undefined){
ary[i] = ary[ary.length-1];
ary.length--;
i--;
continue;
}
obj[item] = item;
}
return ary;
}
console.log(unique([12,23,12,33,45,33,23])); //[12, 23, 33, 45]
(三)基于sort处理
let ary = [1,2,1,1,4,3,3,2,1];
ary = ary.sort();
ary.forEach((item,index) => {
ary.lastIndexOf(item) != index ? (ary.splice(index,ary.lastIndexOf(item) - index)) : null;
});
console.log(ary); //[1, 2, 3, 4]
(四)基于正则处理
let ary = [12,23,12,15,25,23,25,14,16];
ary.sort((a,b) => a - b);
let str = ary.join('@') + '@';
let reg = /(\d+@)\1*/g;
ary = [];
str.replace(reg,(n,m) => {
m = Number(m.slice(0,m.length - 1));
ary.push(m);
});
console.log(ary); //[12, 14, 15, 16, 23, 25]
(五)创建一个新数组方法
方案一:
let ary = [1,2,3,2,1,3,2,1];
let newAry = [];
for(let i = 0;i<ary.length;i++){
//循环获取原有数组中的每一项
let item = ary[i];
//验证新数组中是否存在这一项
if(newAry.includes(item)){
//如果存在这一项,不再增加到新数组中,继续下一轮循环
continue;
}
//新数组中不存在这一项,我们加入到新数组中
newAry.push(item);
}
console.log(newAry); //[1, 2, 3]
方案二:
let ary = [1,2,3,2,1,3,2,1];
let newAry = [];
ary.forEach(item =>{
if(newAry.includes(item)) return;
newAry.push(item);
});
console.log(newAry); //[1, 2, 3]
(六)删除后面的重复项(不用includes/indexOf,这样保证兼容性)
let ary = [1,2,3,3,2,1,1,2,4,2,1,3];
for(var i = 0;i < ary.length;i++){
//item:每一次循环拿出来的当前项
//i:当前项的索引 i+1:代表后一项
var item = ary[i];
//让当前项和后面的每一项进行比较(循环)
for(var j = i+1;j < ary.length;j++){
//compare:后面拿出来要比较的每一项
var compare = ary[j];
//如果compare和item相等,说明这一项是重复的,我们把它删掉
if(compare === item){
//j索引这一项要从数组中移除
ary.splice(j,1);
//数组塌陷了:j后面的每一项索引都提前了一位,下一次要比较的应该还是j这个索引的内容
j--;
}
}
}
console.log(ary); //[1, 2, 3, 4]