今天看了一個面試題 陣列去重至少三種方法 下面寫寫幾種方法
根據下標
var arr = ['f', '0', '3', 'f', 'd', '2', 'd', 'd'] var newarr = [] //定義一個新的陣列 for (var i= 0; i< arr.length; i++) { //遍歷arr 每一項 if(newarr.indexOf(arr[i]) == -1) { //判斷newarr陣列是否存在arr項 newar.push(arr[i]) //newarr裡面不存在就push } } console.log(newarr) //["f", "0", "3", "d", "2"]複製程式碼
indexOf() 返回某個指定字串值在字串中首次出現的位置 如果沒有就返回 -1
newarr這個陣列 裡面找下是否存在arr陣列重複的項 沒有就push
常規去重
var arr = ['f', '0', '3', 'f', 'd', '2', 'd', 'd'] function unique(arr) { var newarr = [arr[0]] //這裡構建一個newarr陣列 且存放了第一個值 以便下面對比 for (var i= 1; i< arr.length; i++) { var isrepeat = false for (var j= 0; j< newarr.length; j++) { //迴圈兩個陣列做對比 if(arr[i] == newarr[j]) { isrepeat = true break //這裡判斷下迴圈arr時候 跟newarr對比 相等就跳出 且給出標記 當前arr陣列第幾個是出現重複的 } } if (!isrepeat) { newarr.push(arr[i]) //這裡 true標記的都是重複的 false都是可以新增的 } } return newarr //完事返回 } console.log(unique(arr)) //["f", "0", "3", "d", "2"]複製程式碼
這種做法 要迴圈原陣列 還要迴圈新陣列 迴圈著比較 確實效率有點低
排序後去重
var arr1 = ['f', '0', '3', 'f', 'd', '2', 'd', 'd'] console.log(arr1.sort()) //["0", "2", "3", "d", "d", "d", "f", "f"] function unique(arr1) { var arr = arr1.sort() var newarr = [arr[0]] //還是要構建一個newarr陣列 存放原陣列第一個元素 for(var i= 1; i<arr.length; i++) { if (arr[i] !== newarr[newarr.length-1]) { newarr.push(arr[i]) } } return newarr } console.log(unique(arr1)) //["0", "2", "3", "d", "f"]複製程式碼
上來排序 這樣使得有重複的元素肯定在一塊 這樣 就可以用
if(arr[i] !== newarr[newarr.length-1]) 判斷 因為都是挨著的 只要判斷原陣列元素跟新陣列最後一個元素比較就可以
排序在去重 有一個不好的地方就是 最後結果也給排序了 改變了原陣列
物件屬性去重(也是網上大家推薦使用的)
var arr = ['f', '0', '3', 'f', 'd', '2', 'd', 'd'] function unique(arr) { var newarr = [] //構建newarr 陣列 var obj = {} //構建一個物件obj for (var i= 0; i< arr.length; i++) { if (!obj[arr[i]]) { //如果元素跟陣列對比 newarr.push(arr[i]) obj[arr[i]] = 1 // 元素內容作為物件屬性 } } return newarr } console.log(unique(arr)) //["f", "0", "3", "d", "2"]複製程式碼
這樣物件屬性做法 將陣列arr 元素跟obj物件對比 看看物件裡面這個屬性 不存在就新增到newarr 並將當前陣列的這個屬性設定一個值表示物件中有了這個值
這樣迴圈完就將 物件中有的屬性拋去 剩下去重後的元素js這些邏輯在演算法中是很基礎的 還有很多好玩的東西 學習無止境