方法 结果 说明
双层 for 循环 [1, “1”, null, undefined, String, String, /a/, /a/, NaN, NaN] 对象和 NaN 不去重
Array.sort()加一行遍历冒泡 [/a/, /a/, “1”, 1, String, 1, String, NaN, NaN, null, undefined] 对象和 NaN 不去重 数字 1 也不去重
Array.filter()加 indexOf [1, “1”, null, undefined, String, String, /a/, /a/] 对象不去重 NaN 会被忽略掉
Object 键值对去重 [1, “1”, null, undefined, String, /a/, NaN] 全部去重
ES6中的Set去重 [1, “1”, null, undefined, String, String, /a/, /a/, NaN] 对象不去重 NaN 去重

双层 for 循环

  1. function distinct(arr) {
  2. for (let i=0, len=arr.length; i<len; i++) {
  3. for (let j=i+1; j<len; j++) {
  4. if (arr[i] == arr[j]) {
  5. arr.splice(j, 1);
  6. // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
  7. len--;
  8. j--;
  9. }
  10. }
  11. }
  12. return arr;
  13. }

双重 for 循环是比较笨拙的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组;因为它的时间复杂度是O(n^2),如果数组长度很大,效率会很低。

Array.filter()加 indexOf

  1. function distinct(a, b) {
  2. let arr = a.concat(b);
  3. return arr.filter((item, index)=> {
  4. return arr.indexOf(item) === index
  5. })
  6. }

利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素

ES6中的Set去重

  1. function distinct(array) {
  2. return Array.from(new Set(array));
  3. return [...new Set(array)];
  4. }

ES6 提供了新的数据结构 Set,Set 结构的一个特性就是成员值都是唯一的,没有重复的值。