別再找了,你要的「去重」都在這~(整理篇)

unique

記錄市面上的全部去重複方法(JS)javascript

1.簡單去重

思路:設置一個空對象和一個空的新數組, 遍歷整個數組,若是對象存在則不向新空數組push數據,不然就向空對象添加以這個數組值爲key的對象,且push到新數組中,這樣最後獲得的就是一個已經去除重複的新數組了。java

/**
 *@arr 爲 [1,2,3,x,x,x,...]
 *輸出 [1,2,3,...]
*/

function uniqueEasy(arr){
    // 判斷arr是否爲數組
    if(!Array.isArray(arr)){
        console.log('type error!')
        return
    }
    let list = []
    let obj = {}
    arr.forEach(v=>{
        if(!obj[v]){
            obj[v] = true
            list.push(v)
        }
    })
    return list
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueEasy(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, Array(0), Array(1), ƒ, Sat Feb 01 2020 16:31:20 GMT+0800 (中國標準時間), Symbol(), Symbol()] // {}與{a:1}都變成了第一個對象{},Symbol判斷不了
複製代碼

2.ES6最簡潔去重

沒法去掉「{}」空對象es6

function uniqueEs6(arr){
    return [...new Set(arr)]
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueEs6(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:27:20 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:27:20 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼

3.filter + indexOf 去重

思路:遍歷數組後過濾出索引等於第一次出現的索引
沒法去掉重複的「{}」空對象,由於 arr.indexOf({}) 找不到web

function uniqueFilter(arr){
    return arr.filter((el,i,oldArr)=>oldArr.indexOf(el)===i)
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueFilter(arr))
// [1, true, false, "string", undefined, null, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:37:36 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:37:36 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼

4.reduce + includes去重

function uniqueReduce(arr){
 return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueReduce(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 19:02:39 GMT+0800 (中國標準時間), Sat Feb 01 2020 19:02:39 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼

5.for嵌套for + splice 去重(ES5)

該方法也沒法去掉重複的「{}」空對象數組

function uniqueEs5(arr)
    for(let i=0; i<arr.length; i++){
        for(let j=i+1; j<arr.length; j++){
            if(arr[i]===arr[j]){
                arr.splice(j,1);
                j--;
            }
        }
    }
    return arr;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueEs5(arr))
// [1, true, false, "string", undefined, null, NaN, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:43:04 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:43:04 GMT+0800 (中國標準時間), Symbol(), Symbol()] // NaN、對象、數組、函數、時間、Symbol都判斷不了
複製代碼

6.indexOf去重

function uniqueIndexOf(arr{
 if (!Array.isArray(arr)) {
     console.log('type error!')
     return
 }
let array = [];
 for (let i = 0; i < arr.length; i++) {
     if (array.indexOf(arr[i]) === -1) {
        array.push(arr[i])
     }
 }
 return array;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueIndexOf(arr))
// [1, true, false, "string", undefined, null, NaN, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:45:44 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:45:44 GMT+0800 (中國標準時間), Symbol(), Symbol()] // NaN、對象、數組、函數、時間、Symbol都判斷不了
複製代碼

7.sort去重

function uniqueSort(arr{
 if (!Array.isArray(arr)) {
    console.log('type error!')
    return;
 }
 arr = arr.sort()
 let arrry= [arr[0]];
 for (let i = 1; i < arr.length; i++) {
    if (arr[i] !== arr[i-1]) {
        arrry.push(arr[i]);
    }
 }
 return arrry;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date()]
console.log(uniqueSort(arr))
// [Array(0), Array(0), Array(1), Array(1), 1, NaN, NaN, Sat Feb 01 2020 17:14:26 GMT+0800 (中國標準時間), Sat Feb 01 2020 17:14:26 GMT+0800 (中國標準時間), {…}, {…}, {…}, {…}, false, ƒ, ƒ, null, "string", true, undefined] // NaN、對象、數組、函數、時間都判斷不了
複製代碼

8.includes去重

function uniqueIncludes(arr{
 if (!Array.isArray(arr)) {
    console.log('type error!')
    return
 }
 let array =[];
 for(let i = 0; i < arr.length; i++) {
    if( !array.includes( arr[i]) ) {//includes 檢測數組是否有某個值
        array.push(arr[i]);
    }
 }
 return array
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueIncludes(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 17:32:46 GMT+0800 (中國標準時間), Sat Feb 01 2020 17:32:46 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼

9.hasOwnProperty去重

function uniqueHasOwnProperty(arr{
 let obj = {};
 return arr.filter(function(item, index, arr){
    return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
 })
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date()]
console.log(uniqueHasOwnProperty(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, Array(0), Array(1), ƒ, Sat Feb 01 2020 17:43:39 GMT+0800 (中國標準時間)] // 對象判斷不了
複製代碼

10.遞歸去重

升序->從最後一個開始向前對比,若是出現重複就刪除app

function uniqueLoop(arr{
 let array= arr;
 let len = array.length;

 array.sort(function(a,b)// 排序後更加方便去重
    return a - b;
 })

 function loop(index){
    if(index >= 1){
        if(array[index] === array[index-1]){
            array.splice(index,1);
        }
        loop(index - 1); // 遞歸loop,而後數組去重
    }
 }
 loop(len-1);
 return array;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date()]
console.log(uniqueLoop(arr))
// [false, null, 1, true, "string", NaN, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 18:41:15 GMT+0800 (中國標準時間), Sat Feb 01 2020 18:41:15 GMT+0800 (中國標準時間), undefined] // NaN、對象、數組、函數、時間都判斷不了
複製代碼

11.Map去重

function uniqueMap(arr{
 let map = new Map();
 let array = new Array(); // 數組用於返回結果
 for (let i = 0; i < arr.length; i++) {
    if(map.has(arr[i])) { // 若是有該key值
        map.set(arr[i], true); 
    } else { 
        map.set(arr[i], false); // 若是沒有該key值
        array.push(arr[i]);
    }
 } 
 return array ;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueMap(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 18:55:44 GMT+0800 (中國標準時間), Sat Feb 01 2020 18:55:44 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼

12.完整版去重

// 輸入 [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
// 輸出 [1,true,false,'string',undefined,null, NaN,{},{a:1},[],[0],function(){}, Sat Feb 01 2020 18:55:44 GMT+0800 (中國標準時間),Symbol()]
複製代碼

要怎麼作呢? 函數


展開查看

function unique(arr){
    // 判斷arr是否爲數組
    if(!Array.isArray(arr)){
        console.log('type error!')
        return
    }
    let list = []
    let obj = {}
    let isUnique = false // 是否惟一
    let type = '' // 元素類型
    let item = null // 新元素項
    arr.forEach(v=>{
        temp = ''
        type = Object.prototype.toString.call(v)
        switch(type){
            case '[object Object]':
                // 對象 對象不能作爲對象的key值
                item = '[object Object]' + JSON.stringify(v)
                isUnique = obj[item]
                break;
            case '[object Symbol]':
                // Symbol Symbol不能隱式轉String
                item = '[object Symbol]' + v.toString()
                isUnique = obj[item]
                break;
            default:
                item = v
                isUnique = obj[v]
        }
        if(!isUnique){
            obj[item] = true
            list.push(v)
        }
    })
    return list
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefinednull,nullNaNNaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(unique(arr))
複製代碼
相關文章
相關標籤/搜索