JavaScript 数组去重

77 阅读2分钟

不考虑兼容的情况:

let arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}, [1, 2], [1, 2]]

使用ES6规范

1)、Array.from(new Set(arr))  // 无法对数组中的数组和对象去重
2)、[…new Set(arr)]  // 无法对数组中的数组和对象去重

兼容写法:

var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}, [1, 2], [1, 2]]

1)、for循环嵌套对比    // 无法对数组中的NaN、数组和对象去重

function unquie(array) {
  if (!Array.isArray(array)) return 'data is not a array'
  for (var i = 0; i < array.length; i++) {
    for (var j = i + 1; j < array.length; j++) {
      if (array[i] === array[j]) {
          array.splice(j, 1);
          j--;
      }
    }
  }
  
  return array
}

console.log(unquie(arr))  
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]

2)、使用空数组+indexOf 组合使用    // 无法对数组中的NaN、数组和对象去重

function unquie(array) {
  if (!Array.isArray(array)) return 'data is not a array'
  
  var _array = []
  for (var i = 0; i < array.length; i++) {
    if (_array.indexOf(array[i]) === -1) {
      _array.push(array[i])
    }
  }

  return _array
}

console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]

3)、使用空数组+includes     // 无法对数组中的数组和对象去重

function unquie(array) {
  if (!Array.isArray(array)) return 'data is not a array'

  var _array = []
  for (var i = 0; i < array.length; i++) {
    if (!_array.includes(array[i])) {
      _array.push(array[i])
    }
  }

  return _array
}

console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]

4)、使用数组的reduce方法+includes 组合    // 无法对数组中的数组和对象去重

function unquie(array) {
  if (!Array.isArray(array)) return 'data is not a array'

  return array.reduce(function (prev, next) {
    if (!prev.includes(next)) prev.push(next)
    return prev
  }, [])
}

console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]

5)、使用Object.hasOwnProperty + filter  // 可以对数组和对象去重,对复杂数组的最优解

function unquie(array) {
  if (!Array.isArray(array)) return 'data is not a array'

  var obj = {}
  return array.filter(function (item) {
    return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
  })
}

console.log(unquie(arr))
// [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {},[1, 2]]

6)、使用filter + includes   // 无法对数组中的数组和对象去重,对NaN直接去除

function unquie(array) {
  if (!Array.isArray(array)) return 'data is not a array'

  return array.filter(function (item, index) {
    return array.indexOf(item) === index
  })
}

console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]

7)、使用new Map   // 无法对数组中的数组和对象去重

function unquie(array) {
  if (!Array.isArray(array)) return 'data is not a array'

  var map = new Map()
  var _array = []
  for (var i = 0; i < array.length; i++) {
    if (!map.has(array[i])) {
      map.set(array[i], false)
      _array.push(array[i])
    }
  }

  return _array
}

console.log(unquie(arr))
// [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {}, {}, [1, 2], [1, 2]]