【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 }

浙公网安备 33010602011771号