【5】数组去重

描述:为 Array 对象添加一个去除重复项的方法

示例1

输入:
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
输出:
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']

双重for循环

原理:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组

缺点:[]和{}没有去重

时间复杂度:O(n2)

 1 function unique(arr) {
 2     for (let i = 0, len = arr.length; i < len; i++) {
 3         for (let j = i + 1; j < len; j++) {
 4             // 防止出现类型转换 如果是==NaN只有一个,null消失3
 5             if (arr[i] === arr[j]) {
 6                 // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
 7                 arr.splice(j, 1);
 8                 len--;
 9                 j--;
10             }
11         }
12     }
13     return arr;
14 }
15 
16 let arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
17 console.log(unique(arr));
18 // [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]

利用ES6的Set去重

原理:

特点:{}没有去重

Array.prototype.uniq = function () {
    return Array.from(new Set(this));
}

利用ES6的扩展运算符去重

原理:

特点:{}没有去重

 1 Array.prototype.uniq = function () {

2 return Array.from(new Set(this));

3 } 

利用ES6数组的扩展includes去重

原理:Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似

特点:{}没有去重

1 Array.prototype.uniq = function () {
2     let res = [];
3     for (let i = 0; i < this.length; i++) {
4         if (!res.includes(this[i])) {
5             res.push(this[i]);
6         }
7     }
8     return res;
9 }

 

posted @ 2021-08-01 18:06  icyyyy  阅读(17)  评论(0)    收藏  举报