1. 程式人生 > >整理一波數組去重方法

整理一波數組去重方法

=== uniq div 鍵值 clas 判斷 .com targe .org

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

循環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進去新數組

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進去新數組

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)); 

對象

將數組值作為對象的屬性,如果重復了就不賦值。

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)); 

但是要註意這個方法不能應對所有情況

1. 無法區分隱式類型轉換成字符串後一樣的值,比如 1 和 ‘1‘ 。

2 .無法處理復雜數據類型,比如對象(因為對象作為 key 會變成 [object Object] )。

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)); 

整理一波數組去重方法