美文网首页
数组去重的几个方案

数组去重的几个方案

作者: Simon_King | 来源:发表于2019-04-03 16:46 被阅读0次

数组去重,直接扩展原型方法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)];
}

相关文章

网友评论

      本文标题:数组去重的几个方案

      本文链接:https://www.haomeiwen.com/subject/thbzbqtx.html