陣列去重的幾種方式
阿新 • • 發佈:2020-09-14
1.reduce實現陣列去重
var myArray = [1,2,2,3,4,4]; var myOrderedArray = myArray.reduce(function (accumulator, currentValue) { //accumulator有初始值 賦值為空陣列 空陣列中沒有1 indexOf為-1 進入迴圈 console.log(accumulator.indexOf(currentValue) ) if (accumulator.indexOf(currentValue) === -1) { //[1] => 在執行 陣列變為[1,2] indexOf 是返回陣列當前值得下標 2第一次進去得時候不存在是-1進入迴圈 //push進去陣列 第二個2存在 返回下標 return出去 以此類推 實現陣列去重 accumulator.push(currentValue); } return accumulator }, []) console.log(myOrderedArray); ================================================================ let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4]; let result = arr.sort().reduce((init, current) => { if(init.length === 0 || init[init.length-1] !== current) { init.push(current); } return init; }, []); console.log(result); //[1,2,3,4,5]
2.includes 去重
let myArray = [1, 2, 2, 3, 4, 4]; let newArr = []; for (let i = 0; i < myArray.length; i++) { let item = myArray[i]; //驗證新陣列中是否存在這一項 if(newArr.includes(item)){continue} //新陣列中不存在這一項,直接加入到新陣列中 newArr.push(item) } console.log(newArr) //原陣列未去重,新陣列去重了 ====================================================================== let myArray = [1, 2, 2, 3, 4, 4]; let newArr = []; myArray.forEach((item)=>{ //驗證新陣列中是否存在這一項 if(newArr.includes(item)){ return } newArr.push(item) }) console.log(newArr) //原陣列未去重,新陣列去重了 //ie 6 7 8 不相容
3.雙重for迴圈去重
一張圖瞭解陣列塌陷問題
function unique(arr){ for(var i=0; i<arr.length; i++){ //讓當前項和後面一項進行比較(迴圈); for(var j=i+1; j<arr.length; j++){ if(arr[i]==arr[j]){ //第一個等同於第二個,splice方法刪除第二個 arr.splice(j,1); j--;//陣列塌陷了 j後面得每一項索引都提前了一位,下一次要比較得應該還是j這個索引得內容 } } } return arr; }
4.indexOf去重
function bb(arr){
let newArr = [];
for(let i = 0;i<arr.length;i++){
if(newArr.indexOf(arr[i]) === -1){
newArr.push(arr[i])//indexOf 不存在返回-1 滿足條件加進去
}
}
return newArr;
}//ie 6 7 8 不相容function bb(arr){
let newArr = [];
for(let i = 0;i<arr.length;i++){
if(newArr.indexOf(arr[i]) === -1){
newArr.push(arr[i])//indexOf 不存在返回-1 滿足條件加進去
}
}
return newArr;
}//ie 6 7 8 不相容
5.物件去重
let arr = [1, 2, 2, 1, 3, 5,6,25];
let obj = {};
let newArr = [];
for (let i = 0; i < arr.length; i++) {
//物件獲取數字物件 用中括號得方法
if (obj[arr[i]] === arr[i]) {
//說明值已經存在
arr.splice(i,1);
i--; //陣列塌陷問題 索引向前提一位
continue
} else {
obj[arr[i]] = arr[i] //物件賦值
newArr.push(arr[i])
}
}
console.log(obj)// {1: 1, 2: 2, 3: 3, 5: 5, 6: 6, 25: 25}
console.log(newArr)// [1, 2, 3, 5, 6, 25]
//缺陷 物件類得值不能處理
============================較好的方法 不使用splice陣列去重=====================
let arr = [1, 2, 2, 1, 3, 5, 6, 25];
let obj = {};
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (obj[arr[i]] === arr[i]) {
arr[i] = arr[arr.length - 1];
arr.length--;
i--;
continue
} else {
obj[arr[i]] = arr[i]
newArr.push(arr[i])
}
}
==============封裝函式方式=======================================
function uniue(arr) {
let obj = {};
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (obj[arr[i]] === arr[i]) {
//如果已經存在 將陣列的最後一位移到當前位置
arr[i] = arr[arr.length - 1];
arr.length--; //然後 刪除最後一項
i--; //並將對應得陣列長度-1
continue
}
newArr.push( arr[i])
obj[arr[i]] = arr[i];
}
return newArr;
}
let arr1 = [1, 2, 2, 1, 3, 5, 6, 25];
;
console.log(uniue(arr1))
6.ES6 Set去重
let arr1 = [1, 2, 2, 1, 3, 5, 6];
let arr = [...new Set(arr1)];
console.log(arr) // [1, 2, 3, 5, 6]