js数组去重(六种方法)

参考文档

一.js数组去重(六种方法)

我自己总结的,只知道这六种去重,其他的不经常用!!!

原数组

const arr = [1, 1, ‘1’, 17, true, true, false, false, ‘true’, ‘a’, {}, {}];

1.new Set(数组ES6新增的特性)

Set是一系列无序、没有重复值的数据集合,传入一个需要去重的数组,Set会自动删除重复的元素
再将Set转数组返回。此方法效率高,代码清晰,缺点是存在兼容性问题

const newArr = [...new Set(arr)];
console.log(newArr);// [1, '1', 17, true, false, 'true', 'a', {}, {}]

2.new Map(MapES6新增的特性)

利用Map的键值对同名覆盖,再将Map转数组

const m = new Map();
for (let i = 0; i < arr.length; i++) {
    m.set(arr[i], arr[i]);
}
const newArr = []
m.forEach(function (value, key) {
    newArr .push(value)
})
console.log(newArr );//[1, '1', 17, true, false, 'true', 'a', {}, {}]

3.indexOf(下标属性来查询)

利用对象属性key排除重复项
遍历数组,每次判断新数组中是否存在该属性,不存在就存储在新数组中
并把数组元素作为key,最后返回新数组
这个方法的优点是效率高,缺点是使用了额外空间

var newArr = [];
arr.forEach((key,index)=>{
    if(newArr.indexOf(key) === -1){
        newArr.push(key)
  }        })
console.log(newArr);// [1, '1', 17, true, false, 'true', 'a', {}, {}]

4.sort(数组排序)

先使用sort方法对传入函数的数组进行从小到大排序,然后创建一个新数组,先将排序好的数组的第一个元素添加到新数组中
然后从第二个元素开始遍历排序好的数组,让每个数组元素都和它的前一个元素比较,如果他们的值不相同,则将该元素值添加到新数组中,最终返回这个新数组。

function uniqArr(arr) {
  var sortArr = arr.sort(function (a, b) {
    return a - b
  })
  var newArr = []
  newArr[0] = sortArr[0]
  for (var i = 1; i < sortArr.length; i++) {
    if (sortArr[i] != sortArr[i - 1]) {
      newArr.push(sortArr[i])
    }
  }
  return newArr
}

5.splice()方法去重

遍历传递进函数的数组,让它和它之后的每一个元素进行比较,如果后边的元素中,有和它的值相等的,就将这个元素通过splice方法删除,然后对应的将数组长度-1,相应下标-1

function uniqArr(arr) {
  var len = arr.length
  for (var i = 0; i < len; i++) {
    for (var j = i + 1; j < len; j++) {
      if (arr[i] == arr[j]) {
        arr.splice(j, 1)
        // 修正下标
        j--
        len--
      }
 
    }
  }
  return arr
}

6.双重for循环去重

先创建一个新的空数组,然后循环遍历传入函数的数组,每次都让遍历到的数组元素和他后边的所有元素进行比较,如果有值和它相同的,就将它的值设置为一个空字符串,比较完毕后,判断这个元素是不是也是一个空字符串,如果不是,那就将其添加到新数组中,最后返回这个新数组。

function uniqArr(arr) {
  var newArr = []
  for (var i = 0; i < arr.length; i++) {
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[i] == arr[j]) {
        arr[j] = ' '
      }
    }
    if (arr[i] != ' ') {
      newArr.push(arr[i])
    }
  }
  return newArr
}