js數組去重與扁平化去重(含es6語法)


數組去重

var arr = [1, 43, 4, 3, 2, 4, 3]; 
// 去重后 
arr = [1, 43, 4, 3, 2]

 傳統方法,for循環實現

//方法一:
function dedupe(arr) {
    var rets = [];
    for (var i = 0; i < arr.length; i ++) {
        if (!rets.includes(arr[i])) {
            rets.push(arr[i]);
        }
    }
    return rets;
}

// 方法二: forEach方法實現
function dedupe(arr) {
    var rets = [];
    arr && arr.forEach(function(item){
        if (!rets.includes(item)){
            rets.push(item);
        }
    });
    return rets;
}

ES6方法實現

// es6提供的新的數據結構Set,類似數組,但是成員的值都是唯一的,沒有重復的值。
function dedupe(arr) {
    var newSet = new Set(arr);  // arr變成了set的數據結構,並去除了其中重復的元素
    return Array.from(newSet);  // Array.from方法將set數據結構轉為數組數據結構
}

復雜的數組去重

[1,2,{a:1},3,2,{a:1},[1,2],[1,2]] 
//數組中的元素包含對象和數組
function unique(arr) {
    const hash = {};
    const res = [];
    for (let i = 0; i < arr.length; i++) {
        if (hash[arr[i]] == null) {
            res.push(arr[i]);
            hash[arr[i]] = true;
        }
    }
    return res;
}
unique([1,2,{a:1},3,2,{a:1},[1,2],[1,2]]);
// 1, 2, {a: 1}, 3, [1, 2]

數組去扁平化 
數組的扁平化,就是將一個嵌套多層的數組array(嵌套可以是任何層數)轉換為只有一層的數組

var arr = [1, 2, 3, [4, 3, [2, 7], 2], 5, [5, 9, 10], 7]; 
// 去扁平化后 
arr = [1, 2, 3, 4, 3, 2, 7, 2, 5, 5, 9, 10, 7];

(1)循環遞歸實現

// for循環,如果子元素還是數組,則遞歸調用該方法
function flatten(arr) {
    var rets = [];
    for(var i = 0; i < arr.length; i ++) {
        if (Array.isArray(arr[i])) {
            rets = rets.concat(flatten(arr[i]));
        } else {
            rets.push(arr[i]);
        }
    }
    return rets;
}

// 使用forEach
function flatten(arr) {
    var rets = [];
    arr && arr.forEach(function(item) => {
        if (Array.isArray(item)) {
            rets = rets.concat(flatten(item));
        } else {
            rets.push(item);
        }
    });
    return rets;
}

(2)使用reduce簡化代碼

function flatten(arr) {
    return arr.reduce(function(pre, item){
        return pre.concat(Array.isArray(item) ? flatten(item) : item);
    }, [])
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM