- 创建新数组, 遍历旧数组
- 利用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 }
- 新建结果数组
- 遍历目标数组, 循环过程当中, 对比索引位置
若是索引相等, 正面前面没相同元素, 能够添加到结果数组html
- NaN都被清理
function unique(arr) { let res = [] arr.forEach((item, index, arr) => { // 查看这个元素对应的索引, 是否应该为当前索引 // 若是没有相同元素, 应该对应当前索引. // 若是前面有相同元素的话, 索引应该是在前面, 不能成功对应 if (arr.indexOf(item) === index) { res.push(item) } }) return res }
- 将目标数组进行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 } } }
- 使用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 ]