数组去重有很多种,这里我记一下经常使用并且复杂度比较小的。
一、子元素为 基本数据 类型去重 arr = [1, 2, 3, 4, 5, 1, 2, 3]
- 使用
filter方法和indexOf方法,复杂度O(n^2)
function uniqueArray(arr) {
return arr.filter((item, index, arr) => arr.indexOf(item) === index)
}
- 使用
filter方法和对象,时间复杂度O(n)
function uniqueArray(arr) {
const obj = {}
return arr.filter(v => obj.hasOwnProperty(v) ? false : obj[v]=true)
}
- 使用
Set数据结构,复杂度O(n)
function uniqueArray(arr) {
return Array.from(new Set(arr))
}
function uniqueArray(arr) {
return [...new Set(arr)]
}
- 使用
map数据结构,复杂度O(n)
function uniqueArray(arr) {
const map = new Map()
return arr.filter(item => !map.has(item) && map.set(item,true))
}
还有一些数组循环的方法,可能特定场景下使用,但是我个人觉得有点冗余
二、子元素为引用类型数组去重 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;
},