说明了面试题中经常出现的JavaScript数组去重问题。之前写过一篇数组去重的文章,(JavaScript数组去重的多种方法原理详解)但是感觉代码还是不够简洁。今天跟大家说说两种方法,只是代码不够。解释方法一:functionunique(arr){constres=newMap();returnarr.filter((a)=>!res.has(a)&&res.set(a,1))}这么短,就这样吧,下面解释一下为什么。Map对象Map是ES6提供的一种新的数据结构。Map对象保存键值对。任何值(对象或基元)都可以用作键或值。下表列出了Map对象的方法。方法说明clear删除所有键/值对,无返回值。delete删除一个键并返回true。如果删除失败则返回false。forEach对每个元素执行指定的操作。get返回Map对象的键对应的值。has返回一个布尔值,指示键是否在当前Map对象中。set将键/值键/值对设置为Map对象。Map对象还有一个size属性,它返回Map对象中键/值对的数量。数组的filter()方法filter()方法创建一个新数组,通过检查指定数组中满足条件的所有元素来检查其元素。语法:array.filter(function(currentValue,index,arr),thisValue)参数说明:箭头函数returnarr.filter((a)=>!res.has(a)&&res.set(a,1))//以上代码可以改成returnarr.filter(function(a){return!res.has(a)&&res.set(a,1);});1、箭头函数写代码语法更简洁;2.这个不会绑定。方法一分析点这里functionunique(arr){//定义常量res,值为一个Map对象实例constres=newMap();//返回arr数组的过滤结果,结果是一个数组//过滤条件是如果res中没有key,则设置这个key的值为1returnarr.filter((a)=>!res.has(a)&&res.set(a,1))}方法二:functionunique(arr){returnArray.from(newSet(arr))}这个方法代码少,不可思议。Array的from方法Array.from()方法从类数组或可迭代对象(包括Array、Map、Set、String、TypedArray、arguments对象等)创建一个新的数组实例。语法:Array.from(arrayLike[,mapFn[,thisArg]])参数说明arrayLike必填,要转换为真正数组的类数组对象或可迭代对象。mapFn是可选的。如果指定了此参数,则最终生成的数组将在返回之前由此函数处理。thisArg可选,执行mapFn函数时this的值。示例代码:constbar=["a","b","c"];Array.from(bar);//["a","b","c"]Array.from('foo');//["f","o","o"]Set对象Set对象允许您存储任何类型的唯一值,无论它是原始值还是对象引用。Set对象是值的集合,您可以按照插入的顺序遍历其元素。Set中的元素只会出现一次,即Set中的元素是唯一的。语法:newSet([iterable]);参数:iterable,如果传入一个可迭代对象(包括Array、Map、Set、String、TypedArray、arguments对象等),它的所有元素都会被添加到新的Set中。如果未指定此参数或其值为空,则新的Set为空。下表列出了Set对象的方法。方法说明add添加一个值并返回Set对象本身。clear删除所有键/值对并且不返回任何值。delete删除一个键并返回true。如果删除失败则返回false。forEach对每个元素执行指定的操作。has返回一个布尔值,指示某个键是否在当前Set对象中。Set对象和Map对象一样,有一个size属性,返回Set对象的值的个数。方法二分析functionunique(arr){//通过Set对象对数组进行去重,结果返回一个Set对象//使用from方法将Set对象转为数组returnArray.from(newSet(arr))}总结一下这次说的两个方法,真的很简单,主要是靠ES6的新东西,难度不大,代码简单,主要是多用。又提醒了一句,[...newSet(arr)]不明白...的朋友,可以看这里js扩展运算符参考ES6新特性:Javascript中的Map和WeakMap对象http:///www.cnblogs.com/dilige...SetandMap数据结构http://es6.ruanyifeng.com/#do...MDNhttps://developer.mozilla.org...Arrayfilter()http://www.runoob.com/jsref/j...Array.from()https://developer.mozilla.org...JavaScript初学者必读《箭头函数》http://www.cnblogs.com/fundeb...
