数组去重的方法

一、双重for

  定义一个新数组,并存放原数组的第0个元素,然后将元素组一一和新数组的元素对比,若不同则存放在新数组中。这里面用到了标志位的思想,先假设不重复var isRepeat = false,如果遇到重复的,就修改为isRepeat = true并且结束循环,循环结束后再判断isRepeat的状态从而决定是否放入新数组。

 1 function unique (arr) {
 2  var newArr = [arr[0]]
 3  for (var i = 1; i < arr.length; i++) {
 4    var isRepeat = false
 5    for (var j = 0; j < newArr.length; j++) {
 6      if (arr[i] === newArr[j]) {
 7        isRepeat = true
 8        break
 9      }
10    }
11    if (!isRepeat) {
12      newArr.push(arr[i])
13    }
14  }
15  return newArr
16 }
17 console.log(unique([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

二、排序 + 去重

先将原数组排序(无论按数字大小排序还是ASCII码排序均可),再与相邻的进行比较,如果不同则存入新数组。
  

 1  function unique2 (arr) {
 2  var sortArr = arr.sort()
 3  var newArr = [sortArr[0]]
 4  for (let i = 1; i < sortArr.length; i++) {
 5    if (sortArr[i] !== sortArr[i-1]) {
 6      newArr.push(sortArr[i])
 7    }
 8  }
 9  return newArr
10 }
11 console.log(unique2([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 12, 2, 3, 7]

 

三、利用对象

利用对象属性名不重复的特性,将数组元素作为对象属性名来取值,如果没有取到值则代表此元素是第一次被遍历到也就是第一次出现,那就把他作为对象属性名存一个值并push进新数组,下次如果再遍历到相同的元素则if不成立,不再push。

 1 function unique3 (arr) {
 2  var obj = {}
 3  var newArr = []
 4  for (let i = 0; i < arr.length; i++) {
 5    if (!obj[arr[i]]) {
 6      obj[arr[i]] = 1
 7      newArr.push(arr[i])
 8    }   
 9  }
10  return newArr
11 }
12 console.log(unique3([1, 2, 2, 2, 3, 1, 12, 7, 12])) //  [1, 2, 3, 12, 7]

 

四、indexOf

利用数组的indexOf下标属性来查询。

 1 function unique4 (arr) {
 2  var newArr = []
 3  for (var i = 0; i < arr.length; i++) {
 4    if (newArr.indexOf(arr[i]) === -1) {
 5      newArr.push(arr[i])
 6    }
 7  }
 8  return newArr
 9 }
10 console.log(unique4([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

五、lastIndexOf

和方法四几乎一致:

 1 function unique5 (arr) {
 2  var newArr = []
 3  for (var i = 0; i < arr.length; i++) {
 4    if (newArr.lastIndexOf(arr[i]) === -1) {
 5      newArr.push(arr[i])
 6    }
 7  }
 8  return newArr
 9 }
10 console.log(unique5([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

六、includes

利用数组原型对象上的includes方法。

 1 function unique6 (arr) {
 2  var newArr = []
 3  for (var i = 0; i < arr.length; i++) {
 4    if (!newArr.includes(arr[i])) {
 5      newArr.push(arr[i])
 6    }
 7  }
 8  return newArr
 9 }
10 console.log(unique6([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

七、filter + includes

利用数组原型对象上的 filter 和includes方法,如果newArr已存在该元素,filter里就return false,否则就push并返回一个true(我这里返回的是push的返回值即数组新的length)。

function unique7 (arr) {
 var newArr = []
 newArr = arr.filter(function (item) {
   return newArr.includes(item) ? false : newArr.push(item)
 })
 return newArr
}
console.log(unique7([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

八、forEach + includes

利用数组原型对象上的 forEach 和 includes方法,和方法七几乎相同。

1 function unique8 (arr) {
2  var newArr = []
3  arr.forEach(item => {
4    return newArr.includes(item) ? '' : newArr.push(item)
5  })
6  return newArr
7 }
8 console.log(unique8([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

九、splice

利用数组原型对象上的 splice 方法。当查找到相同元素使用splice删除,删除之后需要j--,否则会跳过一次比较。

 1 function unique9 (arr) {
 2  for (var i = 0; i < arr.length; i++) {
 3    for (var j = i + 1; j < arr.length; j++) {
 4      if (arr[i] === arr[j]) {
 5        arr.splice(j, 1)
 6        j--
 7      }
 8    }
 9  }
10  return arr
11 }
12 console.log(unique9([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

十、Set

Set数据结构是ES6新增的一种数据结构,它类似于数组,其成员的值都是唯一的,本身就不允许重复。我们可以把数组转换为Set类型再重新转回为数组即可完成去重。

1 function unique10 (arr) {
2  return Array.from(new Set(arr))
3 }
4 console.log(unique10([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

也可以这么写:

1 function unique10 (arr) {
2  return [...new Set(arr))]
3 }
4 console.log(unique10([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

十一、reduce

1 function unique11 (arr) {
2  return arr.reduce((newArr, current) => {
3    return newArr.includes(current) ? newArr : newArr.concat(current)
4  }, [])
5 }
6 console.log(unique11([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

 

posted @ 2020-11-26 12:24  我的五分钱  阅读(123)  评论(0)    收藏  举报