Set

ES6提供了新的数据结构——Set,它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set本身也是一个构造函数,用来生成Set数据结构

var s = new Set();
[2,3,5,4,5,2,2].map(x=>s.add(x))
for(i of s){
console.log(i);//2 3 5 4
}
//上面的代码通过add方法向Set结构加入成员,结果表明Set结构不会添加重复的值。 var set = new Set([1,2,3,4,4]);
//[1,2,3,4]
var items = new Set([1,2,3,4,5,5,5,5]);
items.size//5

Set实例的属性和方法

Set结构的实例有如下属性:

Set.prototype.constructor:构造函数,默认就是Set函数

Set.prototype.size:返回Set实例的成员总数

Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)

add(value):添加某个值,返回Set结构本身

delete(value):删除某个值,返回一个布尔值,表示删除是否成功

has(value):返回一个布尔值,表示参数是否为Set的成员

clear():清除所有成员,没有返回值

s.add(1).add(2).add(2);

//注意2被加入了两次

s.size//2

s.has(1)//true

s.has(2)//true

s.has(3)//false

var properties = {
"width":1,
"height":1
};
if(properties[someName]){
//do something
}
//Set的写法
var properties = new Set();
properties.add("width");
properties.add("height");
if(properties.has(someName)){
//do something
}

Array.from方法可以将Set结构转为数组

var items = new Set([1,2,3,4,5]);
var array = Array.from(items);
//这里提供了一种去除数组的重复元素的方法
function dedupe(array){
return Array.from(new Set(array));
}
dedupe([1,2,2,3]);//[1,2,3]

遍历操作

Set结构的实例有4个遍历方法,可以用来遍历成员

——keys():返回一个键名的遍历器

——values():返回一个键值的遍历器

——entries():返回一个键值对的遍历器

——forEach():使用回调函数遍历每个成员。

keys方法、values方法、entries方法返回的都是遍历器对象,由于Set结构没有键名,只有键值,或者说键名和键值相同,所以keys方法和values方法等效

let set = new Set(['red','green','blue']);
for (let item of set.keys()){
console.log(item);
}
//red
//green
//blue
for(let item of set.values()){
console.log(item);
}
//red
//green
//blue
for(let item of set.entries()){
console.log(item);
}
//['red','red']
//['green','green']
//['blue','blue']

Set结构的实例默认可遍历,其默认遍历器生成函数就是它的values方法

Set.prototype[Symbol.iterator] === Set.prototype.values //true

这就意味着可以省略values方法,直接使用for—of循环遍历Set

let set = new Set(['red','green','blue']);
for(let x of set){
console.log(x);
}
//red
//green
//blue

由于扩展运算符(...)内部使用for...of循环,所以也可以用于Set结构

let set = new Set(['red','green','blue']);
let arr = [...set];
console.log(arr);
//['red','green','blue']

这也提供了一种简便的去除数组重复元素的方法

let arr = [3,5,2,2,5,5];
let unique = [...new Set(arr)];
console.log(unique); // [3,5,2]

而且,数组的map和filter方法也就可以用于Set

let set = new Set([1,2,3]);
set = new Set([...set].map(x=> x*2));
console.log(set);//[2,4,6] let set = new Set([1,2,3,4,5]);
set = new Set([...set].filter(x=>(x%2)==0));
console.log(set);//[2,4]

Set实现并集,交集,差集

ES6 Set结构和Map结构(上)的更多相关文章

  1. js-ES6学习笔记-Set结构和Map结构

    http://www.cnblogs.com/lonhon/ 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set ...

  2. ECMAScript6之Set结构和Map结构

    set数据结构 ES6提供了一个新的数据结构,Set,Set和Array数组相似,但是Set里没有重复的数据,可以说是一个值的集合. 同时,Set数据结构有以下属性和方法: size:返回成员总数 a ...

  3. ES6中Set 和 Map用法

    JS中Set与Map用法 一.Set 1.基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. ...

  4. es6的Set和Map数据结构

    Set 和 Map 数据结构 Set WeakSet Map WeakMap Set § ⇧ 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set ...

  5. ES6学习:Map结构的目的和基本用法

    Map结构的目的和基本用法 JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键.这给它的使用带来了很大的限制.   1 2 3 4 5 6 7 8 ...

  6. ES6笔记(6)-- Set、Map结构和Iterator迭代器

    系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...

  7. es6的Map结构

    es6的Map结构主要解决Object的键名只能是单一属性的问题.它可以是字符串,对象,数组,等等 其中有个问题要注意一下,就是 var map = new Map(); map.set(['a'], ...

  8. set和map结构,class类

    1.set数据结构和map数据结构: (1)set: 数据结构set(集合,无序且值不能重复的数据集合,特点是key值和value值相同,没有重复的value //1 创建set ,,]) conso ...

  9. 线性结构与树形结构相互转换(ES6实现)

    前言 当树形结构的层级越来越深时,操作某一节点会变得越来越费劲,维护成本不断增加.所以线性结构与树形的相互转换变得异常重要! 首先,我们约定树形结构如下: node = { id: number, / ...

随机推荐

  1. Override 和 Overload 的含义和区别

    Override 1.方法重写.覆盖: 2.重写是父类与子类之间多态性的一种表现: 3.方法名,参数,返回值相同: 4.存在于子类和父类之间: 5.修饰为final的方法,不能被重写: Overloa ...

  2. python基础===requests学习笔记

    这里有一个新的学习requests网站:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html2017/11/30 Requ ...

  3. ADO POST时出现“无法为更新定位行,一些值可能已在最后一次读取后已更改”问题的解决方法

    原因有这样几种: 1.在数据库设计时,为某些字段设置了默认值,在修改进行提交以后,数据库会自动修改对应字段的所有行的默认值,从而导致了数据库与数据集中数据的不一致,使ADOQuery无法对数据集进行定 ...

  4. CNN中千奇百怪的卷积方式大汇总

    1.原始版本 最早的卷积方式还没有任何骚套路,那就也没什么好说的了. 见下图,原始的conv操作可以看做一个2D版本的无隐层神经网络. 附上一个卷积详细流程: [TensorFlow]tf.nn.co ...

  5. C中级 数据序列化简单使用和讨论 (二)

    引言 - 一种更好的方式 其实不管什么语言, 开发框架都会遇到序列化问题. 序列化可以理解为A 和 B 交互的一种协议.  很久以前利用 printf 和 scanf 的协议实现过一套序列化问题. C ...

  6. Linux 日志系统及分析

    简介 在Centos 7.x / RHEL 7.x 的版本,系统日志是由一个名为 rsyslog的服务管理的,默认的日志守护进程为 rsyslog , rsyslog 是 syslog 的升级版本,默 ...

  7. leetcode 之Set Matrix Zeroes(10)

    设置两个布尔数组,记录行和列是否存在0.需要注意的是如何将行或列设为0. void setZeros(vector<vector<int>> &matrix) { in ...

  8. Java中的原子操作类

    转载: <ava并发编程的艺术>第7章 当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可 ...

  9. java 内部类和静态内部类的区别

    private class InnerClass {        // 只有在静态内部类中才能够声明或定义静态成员        // private static String tt = &quo ...

  10. hdu 3667(最小费用最大流+拆边)

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...