当前位置: 首页 > Web前端 > HTML5

JS实现数组去重的七种方法_0

时间:2023-04-05 19:39:20 HTML5

JS数组去重的方法示例:去除下面数组中重复的元素(以多种数据类型为例)constarr=[1,2,2,'abc','abc',true,true,false,false,undefined,undefined,NaN,NaN]1.使用Set()+Array.from()Set对象:它是一个值的集合,你可以按照插入的顺序迭代它的元素。Set中的元素只会出现一次,即Set中的元素是唯一的。Array.from()方法:从Array-like或Iterable对象创建Array实例的新浅表副本。constresult=Array.from(newSet(arr))console.log(result)//[1,2,'abc',true,false,undefined,NaN]注:上面方法中去重了NaN和undefined类型它也是有效的,因为NaN和undefined都可以存储在Set中,NaN被认为是相同的值(虽然在js中:NaN!==NaN)。2、使用双层循环+数组的拼接方式,通过双层循环将数组的元素逐一比较,然后使用拼接方式删除重复元素。该方法无法对NaN进行去重,因为比较时NaN!==NaN。functionremoveDuplicate(arr){letlen=arr.lengthfor(leti=0;i{if(newArr.indexOf(item)===-1){newArr.push(item)}})returnnewArr//返回一个新的Array}constresult=removeDuplicate(arr)console.log(result)//[1,2,'abc',true,false,undefined,NaN,NaN]4.使用数组的includes方法。该方法的逻辑与indexOf方法相同,只是使用了includes方法来判断是否包含重复元素。includes()方法:用于判断一个数组是否包含指定值,根据情况,如果包含则返回true,否则返回false。functionremoveDuplicate(arr){constnewArr=[]arr.forEach(item=>{if(!newArr.includes(item)){newArr.push(item)}})returnnewArr}constresult=removeDuplicate(arr)控制台.log(result)//[1,2,'abc',true,false,undefined,NaN]注:为什么includes可以检测到数组中包含NaN,这涉及到includes的底层实现。下图是includes实现的部分代码。在判断一个元素是否被包含时,会调用sameValueZero方法进行比较。如果是NaN,则使用isNaN()进行转换。简单测试一下includes()对NaN的判断:consttestArr=[1,'a',NaN]console.log(testArr.includes(NaN))//true5。使用数组的filter()+indexOf()过滤方法,将满足条件的元素存储到一个新的数组中,使用indexOf方法进行判断。filter()方法:创建一个新数组,其中包含通过提供的函数实现的测试的所有元素。functionremoveDuplicate(arr){returnarr.filter((item,index)=>{returnarr.indexOf(item)===index})}constresult=removeDuplicate(arr)console.log(result)//[1,2,'abc',true,false,undefined]注意:这里的输出不包含NaN,因为indexOf()无法判断NaN,即arr.indexOf(item)===index返回false。测试如下:consttestArr=[1,'a',NaN]console.log(testArr.indexOf(NaN))//-16。使用Map()Map对象是JavaScript提供的一种数据结构,该结构是以keyvalue为形式,数组元素作为map的key存储,前端训练结合has()和set()方法来确定键是否重复。Map对象:用于保存键值对,可以记住键的原始插入顺序。任何值(对象或基元)都可以用作键或值。functionremoveDuplicate(arr){constmap=newMap()constnewArr=[]arr.forEach(item=>{if(!map.has(item)){//has()用于判断map是否包含一个item的属性值map.set(item,true)//使用set()将item设置到map中,并将其属性值设置为truenewArr.push(item)}})returnnewArr}constresult=removeDuplicate(arr)console.log(result)//[1,2,'abc',true,false,undefined,NaN]注意:NaN也可以通过Map()去重,因为Map认为NaN等于NaN判断时,所有其他值都根据===运算符的结果判断是否相等。7、使用对象的思路和Map()类似,主要是对象的属性名不能重复。functionremoveDuplicate(arr){constnewArr=[]constobj={}arr.forEach(item=>{if(!obj[item]){newArr.push(item)obj[item]=true}})returnnewArr}constresult=removeDuplicate(arr)console.log(result)//[1,2,'abc',true,false,undefined,NaN]