JavaScript数组去重方法作者:AbbottLiu(刘建)教育背景:Caledon实例:去除如下数组中的重复元素(以多种数据类型为例)constarr=[0,1,2,3,5,5,6,6,6,7,9]1.使用数组的indexOf方法创建一个空数组,遍历需要去重的数组,将数组元素存入新数组,入库前判断数组中是否已经包含当前元素,如果不存在则入库。此方法也无法对NaN进行去重。indexOf()方法:返回指定值在调用它的String对象中第一次出现的索引,从fromIndex开始搜索。如果未找到该值,则返回-1。functionshowNonDuplicate(arr){letnewArr=[]arr.map(item=>{if(newArr.indexOf(item)===-1)newArr.push(item)})returnnewArr;}2.使用数组filter()+indexOf()filter方法会将满足条件的元素存储到一个新的数组中,使用indexOf方法进行判断。filter()方法:创建一个新数组,其中包含通过提供的函数实现的测试的所有元素。//filterfunctionshowNonDuplicate(arr){arr=arr.filter((item,index,arr)=>{returnarr.indexOf(item)===index})returnarr}注意:这里的输出不包含NaN,因为indexOf()无法判断NaN,即arr.indexOf(item)===index返回false。测试如下:consttestArr=[1,'a',NaN]console.log(testArr.indexOf(NaN))//-13。使用数组的reduce()+includesmethod()方法。该方法的逻辑与indexOf方法相同,只是使用了includes方法来判断是否包含重复元素。includes()方法:用于判断一个数组是否包含指定值,根据情况,如果包含则返回true,否则返回false。functionshowNonDuplicate(arr){letnewArr=[]newArr=arr.reduce((prev,cur,index,arr)=>{returnprev.includes(cur)?prev:[...prev,cur]},[])returnnewArr;}注:为什么includes可以检测到数组中的NaN,这涉及到includes的底层实现。下图是includes实现的部分代码。在判断一个元素是否被包含时,会调用sameValueZero方法进行比较。如果是NaN,则使用isNaN()进行转换。简单测试一下includes()对NaN的判断:consttestArr=[1,'a',NaN]console.log(testArr.includes(NaN))//true4.使用Set()设置对象:是一个集合对于值,您可以按照插入的顺序迭代其元素。Set中的元素只会出现一次,即Set中的元素是唯一的。Array.from()方法:从类数组或可迭代对象创建一个新的、浅表的数组实例副本。functionshowNonDuplicate(arr){returnArray.from(newSet(arr))//return[...newSet(arr)]}注:上述方法对NaN和undefined类型的去重也有效,因为NaN都是NaN和undefined可以存储在Set中,NaN被认为是同一个值(虽然在js中:NaN!==NaN)。5、使用二层循环+数组的splice()方法通过二层循环将数组元素逐一比较,然后使用splice方法删除重复元素。该方法无法对NaN进行去重,因为比较时NaN!==NaN。functionshowNonDuplicate(arr){letlen=arr.lengthfor(leti=0;i
