js数组去重

114 阅读1分钟

一.简单的数组去重

  1. ES6 Set去重
function unique(arr){
    return Array.from(new Set(arr))
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr)) 
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
  1. 嵌套for循环,然后用splice去重(ES5)
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]){
                arr.splice(j,1);
                j--;
            }
        }
    }
    return arr;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]
  1. 利用indexOf去重
function unique(arr){
    if(!Array.isArray(arr)){
        console.log('type error!')
        return
    }
    var array = [];
    for(var i=0;i<arr.length;i++){
        if(array.indexOf(arr[i]) === -1){
            array.push(arr[i])
        }
    }
    return array;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]
  1. 利用sort()
function unique(arr){
    if(!Array.isArray(arr)){
        console.log('type error!')
        return
    }
    arr = arr.sort()
    var array = [arr[0]];
    for(var i=1;i<arr.length;i++){
        if(arr[i] !== arr[i-1]){
            array.push(arr[i])
        }
    }
    return array;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[0, 1, 15, NaN, NaN, "NaN", {…}, {…}, "a", false, null, "true", true, undefined]
  1. 利用includes
function unique(arr){
    if(!Array.isArray(arr)){
        console.log('type error!')
        return
    }
    var array=[];
    for(var i=0;i<arr.length;i++){
        if(!array.includes(arr[i])){ //ncludes 检测数组是否有某个值
            array.push(arr[i]);
        }
    }
    return array;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
  1. 利用filter
function unique(arr){
    return arr.filter((item,index,arr) => {
        return arr.indexOf(item,0) === index;
    })
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]
  1. 利用[...new Set(arr)]

二.引用类型(对象)去重

  1. 数组对象去重
var arr = [{
    name: "ZYTX",
    age: 20,
    gender: "女"
}, {
    name: "ZHLY",
    age: 19,
    gender: "男"
}, {
    name: "ZDHG",
    age: 19,
    gender: "女"
}, {
    name: "ZYTX",
    age: 20,
    gender: "女"
}];
var hash = {}
arr = arr.reduce((item,next) => {
    hash[next.name]?'':hash[next.name] = true && item.push(next);
    return item
},[])
console.log(arr)
  1. 数组对象去重函数写法
function unique(arr){
    let obj = {}
    let newArr = []
    for(let i=0;i<arr.length;i++){
        obj[arr[i].name]?'':obj[arr[i].name] = true && newArr.push(arr[i])
    }
    return newArr
}
  1. 利用filter(ES5实现)
function unique(arr){
    let res = []
    for (let i = 0; i < arr.length; i++) {
        const item = arr[i]
        if (res.filter(ele => ele.id === item.id).length === 0) {
          res.push(item)
        }
     }
    return res
}

function unique(arr){
    var res = arr.filter((item,index,array)=>{
        return arr.indexOf(item) === index
    })
    return res
}

三.数组对象去重排序

let arr = [{id:1}, {id:4}, {id:1}, {id:3}, {id:10}]
//去重
let obj = {}
let newArr = arr.reduce((pre, cur) => {
    obj[cur.id] ? '' : (obj[cur.id] = true && pre.push(cur))
    return pre
  }, [])
console.log(newArr) //[{id:1}, {id:4}, {id:3}, {id:10}]
//排序
newArr.sort((a,b) => {
    return a.id - b.id
})

console.log(newArr) ////[{id:1}, {id:3}, {id:4}, {id:10}]