JS数组去重

数组去重

探讨几种数组去重的方法,多几个思路和解题方法终归是好的。

一、双循环for嵌套 (ES5常用)

比较简单的方法,外层循环元素,内层循环检查是否重复,当有重复的值时,就删除掉。

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

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]) { // 如果有重复值
        arr.splice(j, 1) // splice方法删除重复值
        // 删除后会改变数组长度,下标减1
        j--
      }
    }
  }
  return arr
}
console.log(unique(arr))
  1. 会返回去重后的原数组。
  2. ["true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]。
  3. NaN 和 {} 没有去除。
  4. 如果数组很长,这种方法占用内存很高,效率最低。

二、indexOf去重 (ES5常用)

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

function unique(arr) {
  if (!Array.isArray(arr)) {
    console.log('type error!')
    return
  }
  var newArr = [];  // 新建一个空数组
  for (var i = 0; i < arr.length; i++) { // 循环原数组
    if (newArr.indexOf(arr[i]) == -1) { // 判断新数组newArr里是否存在循环的arr[i]的值,如果有则跳过
      newArr.push(arr[i]) // 没有就push进新数组
    }
  }
  return newArr
}
console.log(unique(arr))
  1. 返回新数组。
  2. [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0,。 "a", {…}, {…}]。
  3. NaN 和 {} 没去重。
  4. 效率相对较高。

三、ES6的Set数据结构特性

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

function unique(arr) {
  return Array.from(new Set(arr))  // Set里的成员具有唯一性
}
console.log(unique(arr))
  1. 返回去重后的新数组。
  2. [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]。
  3. {} 无法去重。
  4. 性能高。

四、对象属性key唯一的特性去重

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

function unique(arr) {
  var obj = {}
  var newArr = []

  for (var i = 0; i < arr.length; i++) {
    if (!obj[arr[i]]) {
      obj[arr[i]] = 1
      newArr.push(arr[i])
    }
  }
  return newArr
}
console.log(unique(arr))
  1. 返回去重后的原数组。
  2. [1, "true", 15, false, undefined, null, NaN, 0, "a", {…}]。
  3. true和'NaN'消失。
  4. 性能很高。
  5. 最好保证类型可控

方法大都类似,以上几种算是较常用的,其他的就不写了!

你可能感兴趣的:(JS数组去重)