indexOf判断(IE8不兼容)
- 建立新数组, 遍历旧数组
- 利用index进行判断, 是否在新数组中, 不存在push到新数组中
- 循环结束, 返回新数组
- 无法去除相同NaN
function unique(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
// 查看结果数组中是否含有我们将要添加的元素
if (res.indexOf(arr[i]) === -1) {
res.push(arr[i])
}
}
return res
}
利用对象保存
- 新建中间对象, 新建结果数组.
- 遍历目标数组, 查看具体值是否为对象的属性名
- 如果不是, 将值变为对象的属性名, 并任意赋值. 并添加到结果数组中
- NaN处理正常
function unique(arr) {
let obj = {},
res = []
for (let i = 0; i < arr.length; i++) {
// 如果不存在这种属性, 也就是数组中没有这个值
if (!obj[arr[i]]) {
// 将这个值变为对象的一个属性名, 并赋值1, 进行保存
obj[arr[i]] = 1;
res.push(arr[i])
}
}
return res
}
indexOf判断(IE8不兼容)
- 新建结果数组
- 遍历目标数组, 循环过程中, 对比索引位置
- 如果索引相等, 正面前面没相同元素, 可以添加到结果数组
function unique(arr) {
let res = []
arr.forEach((item, index, arr) => {
// 查看这个元素对应的索引, 是否应该为当前索引
// 如果没有相同元素, 应该对应当前索引.
// 如果前面有相同元素的话, 索引应该是在前面, 不能成功对应
if (arr.indexOf(item) === index) {
res.push(item)
}
})
return res
}
sort排序截取
- 将目标数组进行sort排序, 相同元素排列到一起
- 查看相同元素是否相同, 相同的话, 进行截取, 一起截取到不同为止.
- 截取后, 元素需要向前-1, 以便后面的元素继续与之前被截取相同元素 再往前的, 也就是相同的那个, 进行比较
- 无法去除相同NaN
function unique(arr) {
// 排序后, 相同数据被放到一起
arr.sort()
for (let i = 0; i < arr.length; ++i) {
// 判断相邻元素是否相同
if (arr[i] === arr[i+1]) {
// 相同情况下: 截取当前相同元素, 并让索引-1, 以免++后少比较一次
arr.splice(i, 1)
--i
}
}
}
ES6
- 使用set数据结构去掉重复数组, 得到对象
- 使用Array.from将对象(类数组)转换为数组
- 或者使用扩展运算符, 进行转换数组
- 正常处理NaN
// let arr = [1, 2, 3, 2, 3, 4, 4, 4, 5, 6, 7, 5]
let arr = ['a', 'a', null, NaN, NaN, null]
let res = new Set(arr)
console.log(res) // Set { 'a', null, NaN }
let myRes = Array.from(res)
console.log(myRes) // [ 'a', null, NaN ]
// let arr = [1, 2, 3, 2, 3, 4, 4, 4, 5, 6, 7, 5]
let arr = ['a', 'a', null, NaN, NaN, null]
let res = new Set(arr)
console.log([...res]) // [ 'a', null, NaN ]
参考: