今天看了一个面试题 数组去重至少三种方法 下面写写几种方法
-
根据下标
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这些逻辑在算法中是很基础的 还有很多好玩的东西 学习无止境