# 数组去重

"老板,这么多方法满不满足你,不要再问我数组去重啦"

# 1. ES6 语法: Set

const arrayUnique = (array)=>{
  return [...new Set(array)]
}

console.log(arrayUnique([1, 2, "2", 3, 3, 4, 5]));

利用 Set 集合中的元素是唯一的这一特性,一句话搞定,注意返回之前要把 Set 集合转为数组

兼容性差一丢丢,比如不能过滤 {}

# 2. ES5 无脑硬肝:两层循环

function arrayUnique (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(arrayUnique([1, 2, "2", 3, 3, 4, 5, 1]));

太无脑了,应该没有人会喜欢,会被嫌弃太菜了

# 3. indexOf 判断

function arrayUnique(array) {
  var result = [];

  for (var i = 0; i < array.length; i++) {
    if (result.indexOf(array[i]) === -1) {
      result.push(array[i]);
    }
  }

  return result;
};

console.log(arrayUnique([1, 2, "2", 3, 3, 4, 5, 1]));

显然比方法 2 高级多了

# 4. sort + 遍历

function arrayUnique(array) {
  array = array.sort();
  var result = [array[0]];

  for (var i = 1; i < array.length; i++) {
    if (array[i] !== array[i - 1]) {
      result.push(array[i]);
    }
  }

  return result;
};

console.log(arrayUnique([1, 2, "2", 3, 3, 4, 5, 1]));

其实感觉有点无聊,但是毕竟也算一种方法

# 5. 利用对象的 key 唯一(hash)

function arrayUnique(array) {
  var object = {};
  var result = [];
  for (var i = 0; i < array.length; i++) {
    if (object[array[i]]) {
      object[array[i]]++;
    } else {
      object[array[i]] = 1;
      result.push(array[i]);
    }
  }
  return result //  [1, 2, 3, 4, 5]
  // return Object.keys(object); // ["1", "2", "3", "4", "5"]
};

console.log(arrayUnique([1, 2, "2", 3, 3, 4, 5, 1]));

数据结构变了,所以兼容性差

# 6. filter

function arrayUnique(array) {
  return array.filter((item, index, array) => {
    // 手动从头获取当前 item 的 index,如果一致则说明么有重复
    return array.indexOf(item, 0) === index;
  });
};

console.log(arrayUnique([1, 2, "2", 3, 3, 4, 5, 1]));

剩下的都是大同小异,不想写了,反正实际工作中还有 underscore、lodash 之类的库函数可以用

Last Updated: 8/26/2020, 5:48:20 PM