看起来不那么low的JS数组去重方法
栏目: JavaScript · 发布时间: 7年前
内容简介:利用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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C语言算法速查手册
程晓旭、耿鲁静、张海、王勇 / 2009-10 / 49.00元
《C语言算法速查手册》用C语言编写了科研和工程中最常用的166个算法,这些算法包括复数运算、多项式的计算、矩阵运算、线性代数方程组的求解、非线性方程与方程组的求解、代数插值法、数值积分法、常微分方程(组)初值问题的求解、拟合与逼近、特殊函数、极值问题、随机数产生与统计描述、查找、排序、数学变换与滤波等。同时结合这些算法列举了将近100个应用实例,对其进行验证和分析。 《C语言算法速查手册》适......一起来看看 《C语言算法速查手册》 这本书的介绍吧!