数组去重的12种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数组去重的12种⽅法 ⽅法⼀:set:不是⼀种数据类型,始终数据结构;成员唯⼀
1 let arr =[12,1,12,3,1,88,66,66,88,999];
2function unique(ary){
3 let s = new Set(ary);
4//Array.from:讲set数据类型结构转成真正的数组;
5 return Array.from(s)
6}
7 unique(arr);
⽅法⼆:对象属性名不能重复
let arr = [12,1,1,22,12,1,55,66,99,88,44]
funciton unqiue(ary){
let obj ={};
for(let i = o ; i < ary.length; i++){
let cur =ary[i];
if(obj[cur]){
//ary.splice(i,1)//导致数组塌陷
ary[i] = ary[ary.length-1];
ary.length--; //删除最后⼀项
i--;
continue;
}
obj[cur]=cur;//给obj新增键值对;属性名和属性值⼀样
}
}
unique(arr);
⽅法三:indexOf
1 let arr = [12,1,12,3,1,88,66,9,66];
2function unique(ary) {
3 let newAry = [];
4for(let i=0;i<ary.length;i++){
5 let cur = ary[i];
6if(newAry.indexOf(cur)===-1){
7 newAry.push(cur);
8 }
9 }
10return newAry;
11 }
12 unique(arr)
⽅法四: sort
let a = ary.sort(function (a,b) {
return a-b;
});
for(let i=0;i<a.length;i++){
if(a[i]===a[i+1]){
a.splice(i+1,1);
i--;
}
}
return a;
}
unique(arr)
⽅法五:includes:包含;如果数组包含哪⼀样,返回true;不包含返回false;
1 let arr = [12,1,12,3,1,88,66,9,66];
2function unique(ary) {
3 let newAry = [];
4 let len = ary.length;
5for(let i=0;i<len;i++){
6 let cur = ary[i];
7if(!newAry.includes(cur)){
8 newAry.push(cur);
9 }
10 }
11return newAry;
12 }
13 console.log(unique(arr));
⽅法六:hasOwnProperty:检测属性名对象的⼀个私有属性;返回⼀个布尔值
1 let arr = [12,1,12,3,1,88,66,9,66];
2function unique(ary) {
3 let obj = {};
4return ary.filter(function (item,index,a) {
5// item : 数组每⼀个成员
6// index: 成员对应的索引
7// a : 整个数组
8// hasOwnProperty来校验的该属性是否出现过;
9return obj.hasOwnProperty(typeof item+item)?false:obj[typeof item+item]=true; 10if(obj.hasOwnProperty(typeof item+item)){
11return false
12 }else{
13 obj[typeof item+item]=true;
14return true;
15 }
16 })
17 }
18 console.log(unique(arr))
⽅法七:filter+indexOf
3return ary.filter(function (item,index,a) { 4return ary.indexOf(item)===index;
5 })
6 }
7 console.log(unique(arr));
⽅法⼋:splice
let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
for(let i=0;i<ary.length;i++){
for(j=i+1;j<ary.length;j++){
if(ary[i]===ary[j]){
ary.splice(j,1);
j--;
}
}
}
return ary;
}
unique(arr);
⽅法九:递归
1 let arr = [12,1,12,3,1,88,66,9,66];
2function unique(ary) {
3 let len= ary.length;
4 ary = ary.sort(function (a,b) {
5return a-b;
6 });
7function loop(index) {
8if(index>=1){
9if(ary[index]===ary[index-1]){
10 ary.splice(index,1);
11 }
12 loop(index-1)
13 }
14 }
15 loop(len-1);
16return ary;
17 }
18 console.log(unique(arr));
⽅法⼗:Map:利⽤map数据结构存值的特点
let newAry =[];
let map = new Map();
for(let i=0;i<ary.length;i++){
if(!map.has(ary[i])){
map.set(ary[i],true);
newAry.push(ary[i]);
}
}
}
unique(arr);
⽅法⼗⼀:reduce
let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
// reduce : 第⼀个是函数,第⼆个参数会传给第⼀次回调的prev;
return ary.reduce((prev,next)=>{
// 该函数返回值是下⼀次执⾏的prev;
return prev.includes(next)?prev:[...prev,next];
},[])
}
console.log(unique(arr));
⽅法⼗⼆:类似于⽅法⼀的set,⽤了剩余运算符...
let arr = [12,1,12,3,1,88,66,9,66];
let a = [...new Set(arr)];
console.log(a);。