let arr=['1','a','a','3','1']
let a=Array.from(new Set(arr))
或者这么写,用扩展运算符(...
),扩展运算符内部调用的是数据结构的 Iterator 接口
let a=[...new Set(arr)]
结果a为["1" , "a" , "3"]
拓展1:Set 实例
1.Set 结构的实例有以下属性
Set.prototype.constructor
:构造函数,默认就是Set
函数
Set.prototype.size
:返回Set
实例的成员总数
2.Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)
2.1.下面先介绍四个操作方法
add(value)
:添加某个值,返回 Set 结构本身
delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功
has(value)
:返回一个布尔值,表示该值是否为Set
的成员
clear()
:清除所有成员,没有返回值
2.2.然后是四个遍历方法,可以用于遍历成员
keys()
:返回键名的遍历器
values()
:返回键值的遍历器
entries()
:返回键值对的遍历器
forEach()
:使用回调函数遍历每个成员
拓展2:Array.from()
Array.from
方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
1.只要是部署了 Iterator 接口的数据结构,Array.from
都能将其转为数组。
2.另一个应用是,将字符串转为数组,然后返回字符串的长度
3.Array.from
的第一个参数指定了第二个参数运行的次数。这种特性可以让该方法的用法变得非常灵活
Array.from({ length: 2 }, () => 'jack')
Array.from({ length: 2 }, () => 'jack')
// ['jack', 'jack']
// ['jack', 'jack']
拓展3:扩展运算符(...
),的应用
1.复制数组
数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
ES5 只能用变通方法来复制数组:
const a1 = [1, 2];
const a2 = a1.concat();
扩展运算符提供了复制数组的简便写法:
const a2 = [...a1];
或
const [...a2] = a1;
2.合并数组
3.与解构赋值结合, 扩展运算符可以与解构赋值结合起来,用于生成数组
4.字符串,扩展运算符还可以将字符串转为真正的数组
5.实现了 Iterator 接口的对象,任何定义了遍历器(Iterator)接口的对象(参阅 Iterator 一章),都可以用扩展运算符转为真正的数组
6.Map 和 Set 结构,Generator 函数,扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Set 结构。