数组去重的方法

120 阅读1分钟

著名面试题:
如何实现数组去重?
假设有数组 array = [1,5,2,3,4,2,3,1,3,4]
你要写一个函数 unique,使得
unique(array) 的值为 [1,5,2,3,4]
也就是把重复的值都去掉,只保留不重复的值。

  1. 自己写的笨方法
function unique(array){
    let arr = []
    array.forEach(item =>{
        if(!arr.find(e => e === item)){
            arr.push(item)
          }
    })
    return arr
  }
let array = [1,5,2,3,4,2,3,1,3,4]
console.log(unique(array))

经典的双循环去重:

function unique(arr) {
    let res = [arr[0]]
    for (let i = 1; i < arr.length; i++) {
        let flag = true
        for (let j = 0; j < res.length; j++) {
            if (arr[i] === res[j]) {
                flag = false;
                break
            }
        }
        if (flag) {
            res.push(arr[i])
        }
    }
    return res
}

缺点是时间复杂度为 O(n^2),数组长的话消耗时间和内存。

  1. indexOf 方法去重
function unique(arr) {
    let array = []
    for (let i = 0; i < arr.length; i++) {
        if (array.indexOf(arr[i]) === -1) {
            array.push(arr[i])
        }
    }
    return array
}

定义空数组,用for循环遍历需要去重的数组arr,调用indexOf方法获取arr元素是否在数组array中,如果不在其中,其索引为-1,将对应的元素push到新数组中。

  1. set去重
function unique(arr){
    return Array.from(new Set(arr))
}
let array = [1,5,2,3,4,2,3,1,3,4]
console.log(unique(array))

优点:代码量少,缺点,达不到去除数组内多个空对象的功能。

  1. map 方法
function unique(arr){
  let unique = {};
   arr.forEach( item => unique[JSON.stringify(item)]=item )
   arr = Object.keys(unique).map(function(u){ 
     return JSON.parse(u);
   })
   return arr;
 }
 }

缺点: 重复的对象{x:1,y:2}与{y:2,x:1}通过JSON.stringify后,其字符串化值不同,对这种对象无法进行去重;对 falsy 元素不能进行去重。

个人学习用