方法一:set:不是一種數據類型,始終數據結構;成員唯一
1 let arr =[12,1,12,3,1,88,66,66,88,999]; 2 function 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]; 2 function unique(ary) { 3 let newAry = []; 4 for(let i=0;i<ary.length;i++){ 5 let cur = ary[i]; 6 if(newAry.indexOf(cur)===-1){ 7 newAry.push(cur); 8 } 9 } 10 return newAry; 11 } 12 unique(arr)
方法四: sort
let arr = [12,1,12,3,1,88,66,9,66]; function unique(ary) { 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]; 2 function unique(ary) { 3 let newAry = []; 4 let len = ary.length; 5 for(let i=0;i<len;i++){ 6 let cur = ary[i]; 7 if(!newAry.includes(cur)){ 8 newAry.push(cur); 9 } 10 } 11 return newAry; 12 } 13 console.log(unique(arr));
方法六:hasOwnProperty:檢測屬性名對象的一個私有屬性;返回一個布爾值
1 let arr = [12,1,12,3,1,88,66,9,66]; 2 function unique(ary) { 3 let obj = {}; 4 return ary.filter(function (item,index,a) { 5 // item : 數組每一個成員 6 // index: 成員對應的索引 7 // a : 整個數組 8 // hasOwnProperty來校驗的該屬性是否出現過; 9 return obj.hasOwnProperty(typeof item+item)?false:obj[typeof item+item]=true; 10 if(obj.hasOwnProperty(typeof item+item)){ 11 return false 12 }else{ 13 obj[typeof item+item]=true; 14 return true; 15 } 16 }) 17 } 18 console.log(unique(arr))
方法七:filter+indexOf
1 let arr = [12,1,12,3,1,88,66,9,66]; 2 function unique(ary) { 3 return ary.filter(function (item,index,a) { 4 return 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]; 2 function unique(ary) { 3 let len= ary.length; 4 ary = ary.sort(function (a,b) { 5 return a-b; 6 }); 7 function loop(index) { 8 if(index>=1){ 9 if(ary[index]===ary[index-1]){ 10 ary.splice(index,1); 11 } 12 loop(index-1) 13 } 14 } 15 loop(len-1); 16 return ary; 17 } 18 console.log(unique(arr));
方法十:Map:利用map數據結構存值的特點
let arr = [12,1,12,3,1,88,66,9,66]; function unique(ary) { 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);