1 最简单方法
// 判断值是否在数组中,如果不在则加入,ie8不支持 indexOf, O(n2)
function uniq (arr) {
let result = []
for (let i = 0, len = arr.length; i < len; i++) {
if (result.indexOf(arr[i] < 0) {
result.push(arr[i])
}
}
return result
}
2 使用 Map 保存
// 使用额外的内存保存,速度快,由于 map 的key 值不区分类型,会将不同类型的值作为相同的值处理,因此需要额外保存类型, 接近 O(n)
function uniq (arr) {
let result = []
let map = {}
for (let i = 0, len = arr.length; i < len; i++) {
const item = arr[i]
const type = typeof item
if (!map[item]]) {
result.push(item)
map[item] =[ type]
} else if (map[item].indexOf(type) < 0) {
result.push(item)
map[item].push(type)
}
}
return result
}
3 数组排序,只添加前面不同的值
// 会打乱原数组顺序,只能去除同类型的值 o(nlogn)
function uniq (arr) {
if (arr.length <= 1) return arr
arr.sort()
let result = [arr[0]]
for (let i = 1, len = arr.length; i < len; i++) {
if (arr[i] !== arr[i-1]) result.push(arr[i])
}
return result
}
4 数组下标法
// 只将第一次出现加入新数组 O(n2)
function uniq (arr) {
let result = []
for (let i = 0, len = arr.length; i < len; i++) {
const item = arr[i]
if (arr.indexOf(item) === i) result.push(arr[i])
}
return result
}
5 将最后出现的值加入数组
function uniq (arr) {
let result = []
let len = arr.length
for (let i = 0; i < len; i++) {
for (let j = i +1; j < len; j++) {
if (arr[i] === arr[j] {
i++
j = i
}
}
result.push(arr[i])
}
return result
}
6 ES6
function uniq (arr) {
return Array.from(new Set(arr))
}
7 filter 实现
// 与方法四相同
function uniq (arr) {
return arr.filter((item, index) => arr.indexOf(item) === index))
}
网友评论