数组去重

79 阅读1分钟

数组去重有很多种,这里我记一下经常使用并且复杂度比较小的。

一、子元素为 基本数据 类型去重 arr = [1, 2, 3, 4, 5, 1, 2, 3]

  1. 使用 filter 方法和 indexOf 方法,复杂度O(n^2)
function uniqueArray(arr) {
    return arr.filter((item, index, arr) => arr.indexOf(item) === index)
}
  1. 使用 filter 方法和对象,时间复杂度O(n)
function uniqueArray(arr) {
    const obj = {}
    return arr.filter(v => obj.hasOwnProperty(v) ? false : obj[v]=true)
}
  1. 使用 Set 数据结构,复杂度O(n)
function uniqueArray(arr) {
    return Array.from(new Set(arr))
}

function uniqueArray(arr) {
    return [...new Set(arr)]
}
  1. 使用 map 数据结构,复杂度O(n)
function uniqueArray(arr) {
    const map = new Map()
    return arr.filter(item => !map.has(item) && map.set(item,true))
}

还有一些数组循环的方法,可能特定场景下使用,但是我个人觉得有点冗余

image.png

image.png

image.png

二、子元素为引用类型数组去重 arr = [{id: 1}, {id: 2}, {id: 1}],复杂度O(n)

function uniqueJsonArrByField(arr, field) {
    // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
    if (arr.length < 2 || !field || typeof arr[0] !== "object") return arr;
    const res = new Map(); // 标识对象
    const uniqueArr = arr.filter((item) => !res.has(item[field]) && res.set(item[field], true));
    return uniqueArr;
},

参考自 www.jb51.net/javascript/…