- 創建新數組, 遍歷舊數組
- 利用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 ]