博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript数组去重—ES6的两种方式
阅读量:6940 次
发布时间:2019-06-27

本文共 2266 字,大约阅读时间需要 7 分钟。

说明

JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的,()但感觉代码还是有点不够简单,今天和大家再说两种方法,代码可是足够的少了。

解释

方法一:

function unique(arr) {    const res = new Map();    return arr.filter((a) => !res.has(a) && res.set(a, 1))}

就这么短,就可以了,我们来解释一下为什么。

Map对象

Map是ES6 提供的新的数据结构。
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

下表列出了 Map 对象的方法。

方法 描述
clear 删除所有的键/值对,没有返回值。
delete 删除某个键,返回true。如果删除失败,返回false。
forEach 对每个元素执行指定操作。
get 返回Map对象key相对应的value值。
has 返回一个布尔值,表示某个键是否在当前 Map 对象之中。
set 给Map对象设置key/value 键/值对。

Map对象还有一个size属性,他返回Map对象的键/值对的数量。

数组的 filter() 方法

filter() 方法创建一个新的数组,新数组中的元素 是 通过检查 指定数组 中 符合条件的所有元素。

语法:

array.filter(function(currentValue,index,arr), thisValue)

参数说明:

图片描述

箭头函数

return arr.filter((a) => !res.has(a) && res.set(a, 1))//上面的代码可以改成这样return arr.filter(function(a){    return !res.has(a) && res.set(a, 1);});
1、箭头函数写代码拥有更加简洁的语法;
2、不会绑定this。

了解更多,点

方法一 分析

function unique(arr) {    //定义常量 res,值为一个Map对象实例    const res = new Map();        //返回arr数组过滤后的结果,结果为一个数组    //过滤条件是,如果res中没有某个键,就设置这个键的值为1    return arr.filter((a) => !res.has(a) && res.set(a, 1))}

方法二:

function unique(arr) {    return Array.from(new Set(arr))}

这个方法的代码量更少,简直不可思议。

数组的 from方法

Array.from() 方法从一个类似数组或可迭代的对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等) 中创建一个新的数组实例

语法:

Array.from(arrayLike[, mapFn[, thisArg]])
参数 描述
arrayLike 必需,想要转换成真实数组的类数组对象或可迭代的对象。
mapFn 可选,如果指定了该参数,则最后生成的数组会经过该函数的加工处理后再返回。
thisArg 可选,执行 mapFn 函数时 this 的值。

示例代码:

const bar = ["a", "b", "c"];Array.from(bar);// ["a", "b", "c"]Array.from('foo');// ["f", "o", "o"]

Set对象

Set 对象允许你存储任何类型的 唯一值 ,无论是原始值或者是对象引用。
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。
Set中的元素只会出现一次,即 Set 中的元素是唯一的。

语法:

new Set([iterable]);

参数:

iterable,如果传递一个可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等),它的所有元素将被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空。

下表列出了 Set 对象的方法。

方法 描述
add 添加某个值,返回Set对象本身。
clear 删除所有的键/值对,没有返回值。
delete 删除某个键,返回true。如果删除失败,返回false。
forEach 对每个元素执行指定操作。
has 返回一个布尔值,表示某个键是否在当前 Set 对象之中。

Set对象和Map对象一样,都有一个size属性,他返回Set对象的值的个数。

方法二 分析

function unique(arr) {    //通过Set对象,对数组去重,结果又返回一个Set对象    //通过from方法,将Set对象转为数组    return Array.from(new Set(arr))}

总结

这次说的两个方法,真的很简单,主要就是靠ES6里的新东西,难度不大,代码简单,主要就是多用用就好了。


经人提醒,再补充一种,[...new Set(arr)]

图片描述

不懂 ... 的朋友,可以看这里

参考

ES6新特性:Javascript中的Map和WeakMap对象

Set和Map数据结构
MDN
Array filter()
Array.from()
JavaScript初学者必看“箭头函数”

转载地址:http://fysnl.baihongyu.com/

你可能感兴趣的文章
使用Ajax内容签名,减少流量浪费
查看>>
mysql 架构 ~异地容灾
查看>>
mui 上拉刷新加载template数据
查看>>
JavaScript中==比较时的过程
查看>>
HIDKomponente使用读写Hid设备一瞥
查看>>
gruntjs本地安装的流程
查看>>
mysql_real_escape_string
查看>>
elasticsearch配合mysql实现全文搜索
查看>>
Code Signal_练习题_depositProfit
查看>>
Oracle数据库—— 存储过程与函数的创建
查看>>
由于行255而未能重新格式化文档。已还原为原始格式。
查看>>
MVC的view页面内嵌C#语法发现路径被转码的解决方法
查看>>
PMBOK项目管理PMI主义\IPMA概述
查看>>
vscode中使用node服务调试,会在promise的reject出现断点报错
查看>>
SilverLight之向后台请求数据-WebClient
查看>>
2008server安装Intel I217V网卡驱动
查看>>
安卓应用获取权限判断
查看>>
hdu 1695(欧拉函数 容斥定理)
查看>>
CentOS 6.7安装MySQL
查看>>
Docker容器互联
查看>>