数组去重,直接扩展原型方法unique
方法1: 利用知识点:Set()、Array.from()
ES6新增的数据结构,类似于数组,成员变量都是唯一的
Set()函数接受一个数组或类数组的参数,返回生成的set结构
Set实例拥有方法
new Set().add(value) //添加一个值,返回set结构本身
new Set().delete(value) //删除指定的值,返回布尔值,表示是否删除成功,删除一个已存在的值返回ture,删除一个不存在的值返回false
new Set().has(value) //判断是否有这个值,返回布尔值
new Set().clear() //清除所有的值,没有返回值(或者说是undefined)
Array.from(obj)
将两类对象转为真正的数组:1.类数组对象(Array-like-Object) 和可遍历对象(iterable-Object),包括ES6新增的数据结构Set和Map
数据举例:常见的DOM操作的NodeList、arguments对象、字符串。
Set结构的唯一性,是数组去重最吻合的特点,而set结构能够被Array.from转换成真正的数组,所以我们通过Set传入需要去重的数组,然后再通过Array.from转换成普通数组,即得到了想要的结果,实现代码如下:
Array.prototype.unique = function(){
return Array.from(new Set(this));
}
方法2: 利用知识点[].filter()、Map()
[].filter(fn),参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组
-->> fn(value, index, array)参数函数接受3个参数,类似forEach,第一个参数是当前数组成员的值,这是必需的,后两个参数是可选的,分别是当前数组成员的位置和整个数组。
[].filter(fn, context) 还可以接受第二个参数,指定测试函数所在的上下文对象(即this对象)。
Array.prototype.unique = function(){
const map = new Map();
/* 这里要用this.filter 而不是Array.prototype.filter 因为要处理的是数组实例,而不是原型
* !map.has(item) && map.set(item) 用到了&&
* &&有3层理解:
* 第一层理解:当操作数都是布尔值时,&&运算符对两个值执行布尔与(and)操作,只有第一个操作数和第二个操作数都是true,它才返回true 例如:a==1&&b==1 仅当a和b都是1,才返回true
* 第二层理解:&&可以对真值和假值进行布尔与(and)运算。把&&符号左侧和右侧的表达式或者数据类型转为布尔值,例如if(1&&2) 1&&2转为了true
* 第三层理解:左侧的表达式求值为false时,直接左侧作为返回值,如果左侧为true时,计算右侧并返回右侧的值 console.log( 1&&2 ) 输出是2,而不是true(上次面试就遇到过console.log(1&&2) 果断填2)
*/
return this.filter( (item) => !map.has(item) && map.set(item,'any') );
}
方法3:利用[...]、Set()
Array.prototype.unique = function(){
return [...new Set(this)];
}
网友评论