面试题之 JS 数组去重

257 阅读1分钟

情况1: 纯数组

  1. 一句话去重
var a = [2,2,2,2,4]
[...new Set(a)] // [2,4]
  1. indexof || includes || new Set()
function unip1(arr){
    let res = [];
    for(var i=0;i<arr.length;i++){
        if(!res.includes(arr[i])){
            res.push(arr[i])
        }
    }
     return res
}
unip1([2,2,3,4,4])

情况2: 如果数组内是对象列表,👆的方法就不可行了

  1. 一些常规for循环方法 indexOf,includes,new Set()等
function unip2(arr){
    let res = [];
    let temp= new Set();
    for(var i=0;i<arr.length;i++){
       let current = arr[i];
        if(!temp.has(current.type)){
            res.push(current)
            temp.add(current.type)
        }
    }
     return res
}
var a  = [{type:2},{type:3},{type:2}]
unip2(a)
function unip3(arr){
    let res = [];
    let temp= {};
    for(var i=0;i<arr.length;i++){
       let current = arr[i];
        if(!temp[current.type]){
            res.push(current)
            temp[current.type]=true;
        }
    }
     return res
}
var a  = [{type:2},{type:3},{type:2}]
unip3(a)
  1. 可以累加器去重
var a  = [{type:2},{type:3},{type:2}]
let hash = {}
a.reduce((preVal,curVal)=>{
    hash[curVal.type] ? '' :  hash[curVal.type]=true && preVal.push(curVal)
    return preVal
},[])

总结:

去重的一个原理就是:

  1. 开辟一个空间res,把结果放进去
  2. 有一个对象变量,对象中放置对象要去重的key
  3. 如果对象中没有这个key就 push 到新开辟的res数组中