整理一波數組去重方法

關於數組去重,一直用的是循環,還有es6的set,查閱資料竟有如此多的去重方法,整理了以下。直接上乾貨javascript

循環1

function unique(arr) {
    var newArr = [];
    var isRepeat;
    for(var i=0; i<arr.length; i++) {
        isRepeat = false;
        for(var j=i+1; j<arr.length; j++) {
            if(arr[i] === arr[j]){
                isRepeat = true;
                break;
            }
        }
        if(!isRepeat){
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

循環2

var newArr = [];
for(var i=0; i<arr.length; i++){
    for(var j=i+1; j<arr.length; j++){
        if(arr[i] === arr[j]){
            j = ++i;
        }
    }
    newArr.push(arr[i]);
}
return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

foreach方法

遍歷傳入的數組元素,若是新數組中沒有這個元素,就push進去新數組java

function unique(arr) {
    var newArr = []; arr.forEach(function(item){ if(newArr.indexOf(item) === -1){ newArr.push(item); } }); return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr)); 

filter方法

item 表示數組中的每一個元素,index 是每一個元素的出現位置。indexOf 返回匹的 第一個索引。
function unique(arr) {
    return arr.filter(function(item, index){
        return arr.indexOf(item) === index;
    });
}

sort方法

先排序,再比較相鄰的是否相同,不一樣就push進去新數組es6

function unique(arr) {
    var newArr = [];                  
    arr.sort();
    for(var i = 0; i < arr.length; i++){
        if( arr[i] !== arr[i+1]){
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

sort方法2

對數組排序,將第一個元素push進去新數組,再將每一個要放進入的元素與新數組的最後一個元素比較,不一樣就push數組

function unique(arr) {
    var newArr = [];                  
    arr.sort();
    var newArr = [arr[0]];
    for(var i = 1; i < arr.length; i++){
        if(arr[i] !== newArr[newArr.length - 1]){
        newArr.push(arr[i]);
        }
    }    
    return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

對象

將數組值做爲對象的屬性,若是重複了就不賦值。spa

function unique(arr) {
    var newArr = [];
    var tmp = {};
    for(var i=0; i<arr.length; i++){
        if(!tmp[arr[i]]){
            tmp[arr[i]] = 1;
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

可是要注意這個方法不能應對全部狀況code

1. 沒法區分隱式類型轉換成字符串後同樣的值,好比 1 和 '1' 。對象

2 .沒法處理複雜數據類型,好比對象(由於對象做爲 key 會變成 [object Object] )。blog

3. 特殊數據,好比 '__proto__' ,由於 tmp 對象的 __proto__ 屬性沒法被重寫。排序

對象的升級1

function unique(arr) {
    var newArr = [];
    var tmp = {};
    var tmpKey;
    for(var i=0; i<arr.length; i++){
        tmpKey = typeof arr[i] + arr[i];
        console.log(tmpKey); 
        if(!tmp[tmpKey]){
            tmp[tmpKey] = 1;
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [5,6,'1',8,1,6];
console.log(unique(arr)); 

對象升級2

function unique(arr) {
    var newArr = [];
    var tmp = {};
    var tmpKey;
    for(var i=0; i<arr.length; i++){
        tmpKey = typeof arr[i] + JSON.stringify(arr[i]);
        console.log(tmpKey)
        if(!tmp[tmpKey]){
            tmp[tmpKey] = 1;
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

es6 map

Map 是一種新的數據類型,也是鍵值對的集合,可是「鍵」的範圍不限於字符串,各類類型的值(包括對象)均可以看成鍵。索引

function unique(arr) {
    var newArr = [];
    var tmp = new Map();
    for(var i=0; i<arr.length; i++){
        if(!tmp.get(arr[i])){
            tmp.set(arr[i], 1);
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

es6 set

Array.from() 方法從一個相似數組或可迭代對象中建立一個新的數組實例。

function unique(arr){
    var set = new Set(arr);
    return Array.from(set);
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 

includes()方法

includes()方法用來判斷一個數組是否包含一個指定的值,根據狀況,若是包含則返回 true,不然返回false。

function unique(arr) {
    var newArr = [];
    arr.forEach(function(item){
        if(!newArr.includes(item)){
            newArr.push(item);
        }
    });
    return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr)); 
相關文章
相關標籤/搜索