看起来不那么low的JS数组去重方法
栏目: JavaScript · 发布时间: 6年前
内容简介:利用ES6 Set集合成员具有唯一值的特性,再借助Array.from将类数组转为真正的数组我们可以很简单的完成数组去重任务indexOf():
①利用ES6的Set集合
利用ES6 Set集合成员具有唯一值的特性,再借助Array.from将类数组转为真正的数组
我们可以很简单的完成数组去重任务
let res = Array.from(new Set(arr));
②indexOf和filter的配合
indexOf():
返回数组中某个指定的元素第一次出现的位置(索引)。如果在数组中没找到指定元素则返回 -1。
filter():
返回指定数组中符合条件的所有元素
关键语句:
index === array.indexOf(ele)
我们利用indexOf得到的下标与当前元素的下标来判断这个元素是否是第一次出现,然后在利用filter的过滤特性即可。
这里需要注意的判断NaN,因为 NaN !== NaN ,所有 indexOf(NaN)始终返回-1 ,所以我们需要额外去判断
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,表明已经存在该元素
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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 6个技巧,让你的可视化看起来更专业
- 让 LaunchBar 在深色模式下看起来更原生的技巧
- CentOS 8.0 看起来还需要几周的时间
- 换芯 Edge 的新截图曝光,看起来更像 Chrome 了?
- 如何让你的网页“看起来”展现地更快 —— 骨架屏二三事
- 看起来很复杂的 DEVONthink 搜索,用 Alfred Workflow 就能轻松搞定
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Developer's Guide to Social Programming
Mark D. Hawker / Addison-Wesley Professional / 2010-8-25 / USD 39.99
In The Developer's Guide to Social Programming, Mark Hawker shows developers how to build applications that integrate with the major social networking sites. Unlike competitive books that focus on a s......一起来看看 《Developer's Guide to Social Programming》 这本书的介绍吧!