利用ES6 Set集合成员具备惟一值的特性,再借助Array.from将类数组转为真正的数组
咱们能够很简单的完成数组去重任务数组
let res = Array.from(new Set(arr));
indexOf():
返回数组中某个指定的元素第一次出现的位置(索引)。若是在数组中没找到指定元素则返回 -1。
filter():
返回指定数组中符合条件的全部元素
关键语句:this
index === array.indexOf(ele)
咱们利用indexOf获得的下标与当前元素的下标来判断这个元素是不是第一次出现,而后在利用filter的过滤特性便可。
这里须要注意的判断NaN,由于 NaN !== NaN,因此indexOf(NaN)始终返回-1,因此咱们须要额外去判断prototype
Array.prototype.uniq = function(){ let flag = true; // 定义标记用来判断NaN return this.filter((ele, index, array) => { if(flag && ele!==ele){ flag = false; return true; } return index===array.indexOf(ele) }) }
核心:利用对象的键来存储咱们的元素
若是没有对象中没有这个键,则进行存储,并设置这个键对应值为true,代表已经存在该元素code
Array.prototype.uniq = function(){ let hash = {}; let data = []; this.forEach(ele => { if (!hash[ele]) { hash[ele] = true; data.push(ele); } }) return data; }
注意:因为普通对象的键都是字符串,因此对于像 Number(1)和String(1)则视为它们是同一值,没法正确判断,对于引用类型的数据也是如此( 如 {} 和 {} 视为同一值)对象
解决办法:在ES6中提供了Map集合,Map的键再也不局限于字符串,而是任意类型,能够说是一个完整的hash结构,利用Map替换普通对象{}则能够解决上面的问题排序
Array.prototype.uniq = function(){ let map = new Map(); let data = []; this.forEach(ele => { if(!map.get(ele)){ map.set(ele, true); data.push(ele); } }); return data; }
在数组排序后,相同的数据会集中在一块儿,所以只须要比较相邻元素是否相等便可,
比较符能够用 严格比较运算符(===) 或者 Object.is()
它们不一样之处只有两个:一是+0不等于-0,二是NaN等于自身。
因此对于NaN,若是使用===,则须要额外判断
根据以下方案,数组最后一个元素必然是惟一值,因此在循环后把末尾的元素添加进去索引
Array.prototype.uniq = function(){ let res = []; let arr = this.sort(); for(let i = 0; i < arr.length-2; i++){ if(!Object.is(arr[i], arr[i+1])){ res.push(arr[i]) } } res.push(arr.pop()); return res; }