8 个常用的数组去重方法

121 阅读1分钟

8 个常用的数组去重方法

1.利用对象的属性

使用对象属性不重名的特性。

var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
console.time('nonredundant1')
var nonredundant1 = Object.getOwnPropertyNames(
  arr.reduce(function (seed, item, index) {
    seed[item] = index
    return seed
  }, {})
)
console.timeEnd('nonredundant1')
console.log((.*?))(nonredundant1)

2. 使用 Set 数据结构

set 是一种类似数组的结构,但是 set 成员中没有重复的值。set()函数可以接受一个数组或者类数组的参数,生成一个 set 对象。而 Array.from 方法用于将两类对象转为真正的数组:类似数组的对象(array-like object 和可遍历 iterable)的对象包括 ES6 新增的数据结构 Set 和 Map)。

var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
function unique(arr) {
  return Array.from(new Set(arr))
}
console.time('nonredundant2')
var nonredundant2 = unique(arr)
console.timeEnd('nonredundant2')
console.log((.*?))(nonredundant2)

var arr = [3, 5, 2, 2, 5, 5]
console.log((.*?))([...new Set(arr)])  (3) [3, 5, 2]

3. 使用 for 循环和 splice

function unique(arr) {
  for (var i = 0; i < arr.length; i++) {
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[i] == arr[j]) {
        第一个等同于第二个,splice方法删除第二个
        arr.splice(j, 1)
        j--
      }
    }
  }
  return arr
}
console.time('nonredundant3')
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
var nonredundant3 = unique(arr)
console.timeEnd('nonredundant3')
console.log((.*?))(nonredundant3)

4.使用 indexOf 判断去重

function unique(arr) {
  var array = []
  for (var i = 0; i < arr.length; i++) {
    if (array.indexOf(arr[i]) === -1) {
      array.push(arr[i])
    }
  }
  return array
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
console.time('nonredundant4')
var nonredundant4 = unique(arr)
console.timeEnd('nonredundant4')
console.log((.*?))(nonredundant4)

5.使用 sort 排序去重

function unique(arr) {
  arr = arr.sort()
  var arrry = [arr[0]]
  for (var i = 1; i < arr.length; i++) {
    if (arr[i] !== arr[i - 1]) {
      arrry.push(arr[i])
    }
  }
  return arrry
}

var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
console.time('nonredundant5')
var nonredundant5 = unique(arr)
console.timeEnd('nonredundant5')

6.使用 filter

function unique(arr) {
  var obj = {}
  return arr.filter(function (item, index, arr) {
    return obj.hasOwnProperty(typeof item + item)
      ? false
      : (obj[typeof item + item] = true)
  })
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
console.time('nonredundant6')
var nonredundant6 = unique(arr)
console.timeEnd('nonredundant6')
console.log((.*?))(nonredundant6)

7.使用 Map 数据结构去重

function unique(arr) {
  let map = new Map()
  let array = new Array()  数组用于返回结果
  for (let i = 0; i < arr.length; i++) {
    if (map.has(arr[i])) {
       如果有该key值
      map.set(arr[i], true)
    } else {
      map.set(arr[i], false)  如果没有该key值
      array.push(arr[i])
    }
  }
  return array
}

var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
console.time('nonredundant7')
var nonredundant7 = unique(arr)
console.timeEnd('nonredundant7')
console.log((.*?))(nonredundant7)

8.使用 reduce 和 include 去重

function unique(arr) {
  return arr.reduce(
    (prev, cur) => (prev.includes(cur) ? prev : [...prev, cur]),
    []
  )
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao']
console.time('nonredundant8')
var nonredundant8 = unique(arr)
console.timeEnd('nonredundant8')
console.log((.*?))(nonredundant8)