学习set

set是ES6中的新增的数据结构,是一种构造函数,类似于数组,但是里面的元素都是唯一的,不重复的。

例如:

const set = new Set();
[1,2,3,4,5,2,1,2,1,2].forEach( x => set.add(x) );
for(let i of set) {
console.log(i); // 1 2 3 4 5
}

set的属性

set的属性包括constructor(set原型)和size(用来记录set的大小)。

用法:Set.prototype.constructor,Set.prototype.size

例如:

let set = new Set([1,2,3,2,2,2,1,2,34,4,45,523]);
console.log(set.constructor); // ƒ Set() { [native code] }
console.log(set.size); // 7

set的方法

set的操作方法

  • add(val); 添加某个值
  • delete(val); // 删除某个值,返回布尔值,表示结果。
  • has(val); // 判断该值是否存在于Set中。
  • clear(); // 清楚所有的值

例如:

let set = new Set();
//1.add();
set.add(12).add(32);
console.log(set); // Set(2) {12, 32}
// 2.delete(val);
set.delete(32);
console.log(set); // Set(1) {12}
//3.has(val);
console.log(set.has(88)); // false
//4.clear();
set.clear();
console.log(set); // Set(0) {}

set的遍历方法

set的键和值是同一个值。

  • keys() 返回键名的方法
  • values() 返回键值的方法
  • entries() 返回键值对的方法
  • forEach() 用回调函数遍历各个元素的方法

例如:

let set = new Set([2,2,2,1,5,34,45,33,23,32]);

for(let item of set.keys()) {
console.log(item); // // 2 1 5 34 45 33 23 32
} for(let item of set.values()) {
console.log(item); // // 2 1 5 34 45 33 23 32
} for(let item of set.entries()) {
console.log(item); // [2, 2] [1, 1] [5, 5] [34, 34] [45, 45] [33, 33] [23, 23] [32, 32]
} set.forEach((value,key) => console.log(key+ '=' +value)); // 2=2 1=1 5=5 34=34 45=45 33=33 23=23 32=32

应用

...运算符和Array.from以及mapfilter都可以遍历set结构。

...运算符

例如:

let set = new Set('123456654321');
console.log([...set]); // ["1", "2", "3", "4", "5", "6"]

...和数组加起来可以去重

例如:

let arr = [1,2,3,4,6,3,3,1,3,4];
let removeRepeat = [...new Set(arr)];
console.log(removeRepeat); //[1, 2, 3, 4, 6]

map方法

例如:

let set = new Set([1,2,3,4]);
console.log(new Set([...set].map(x => x*2))); // {2, 4, 6, 8}

filter方法

例如:

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

Array.from

例如:

let set = new Set([1,2,3,4]);
console.log(new Set(Array.from(set, x => x*2))); // {2, 4, 6, 8}

小案例

使用这个set可以实现数学中的交集,并集效果。

例如:

let a = new Set([1,2,3]);
let b = new Set([3,4,5]); let numa = new Set([...a,...b]);
console.log(numa); // {1, 2, 3, 4, 5}
//并集
let numb = new Set([...a].filter(x => b.has(x)));
console.log(numb); // {3}

学习WeakSet

WeakSet和Set类似,也是没有重复的值。注意的是,它里面的成员只能是对象,其他数据类型不接受。

例如:

let ws = new WeakSet(1); // Uncaught TypeError: number 1 is not iterable (cannot read property Symbol(Symbol.iterator))
let wsa = new WeakSet('1'); // Uncaught TypeError: Invalid value used in weak set
let wsb = new WeakSet({x:1}); // Uncaught TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))
let wsc = new WeakSet([1,3]); // Uncaught TypeError: Invalid value used in weak set
let wsc = new WeakSet([[1,2],[3,4]]);
console.log(wsc); // WeakSet {Array(2), Array(2)}

结论:从上面的例子中,可以看出1.WeakSet构造函数的参数不接受字符串,数字,普通对象,数组(数组中的参数必须是对象);接受数组(数组中的参数是对象的数组)。

WeakSet的方法

  • WeakSet.prototype.add(val)添加一个值;
  • WeakSet.prototype.delete(val)删除一个值;
  • WeakSet.prototype.has(val)是否有这个值;

例如:

let wset = new WeakSet([[1,3,4],[23,4,52,2]]);
//1.添加值
wset.add([12,33,23]);
console.log(wset); // WeakSet {Array(3), Array(4), Array(3)} //2.删除值
wset.delete([12,33,23]);
console.log(wset); // WeakSet {Array(4), Array(3)} //3.是否有这个值
console.log(wset.has([12,33,23])); // false

WeakSet的属性

由于WeakSet中的值都是弱属性,随时可能消失,被垃圾回收,遍历机制无法保证值是否还存在,所以不能用sizeforEach()

例如:

let wset = new WeakSet([[1,3,4],[23,4,52,2]]);
console.log(wset.size); // undefined
for(let i=0;i<wset.length;i++) {
console.log(wset[i]);
}

写在最后

Set和WeakSet就介绍到这里,赶快用起来吧!

ES6之新增set数据结构的更多相关文章

  1. 10.1 ES6 的新增特性以及简单语法

    ES6 的新增特性以及简单语法  let 和 const 模板字符串 箭头函数 对象单体模式 es6面向对象 模块化  let 和 const 之前一直用 var 来声明变量,ES6 新增 let 和 ...

  2. es6学习笔记8--Map数据结构

    Map Map结构的目的和基本用法 JavaScript的对象(Object),本质上是键值对的集合(Hash结构),但是只能用字符串当作键.这给它的使用带来了很大的限制. var data = {} ...

  3. js ES6 Set和Map数据结构详解

    这篇文章主要介绍了ES6学习笔记之Set和Map数据结构,结合实例形式详细分析了ECMAScript中基本数据结构Set和Map的常用属性与方法的功能.用法及相关注意事项,需要的朋友可以参考下   本 ...

  4. es6 Set 和Map 数据结构

    ES6提供了新的数据结构Set,它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个数据结构,用来生成Set 数据结构. const s = new Set(); [2,3,5,4 ...

  5. ES6中新增let命令使用方法

     在ES6中新增了let命令,该命令的用法与var 类似,但是所声明的变量只能在let命令所在的代码块(最接近let 命令的大括号内)中有效果.但是let 又有一些不同于var 的特性. 1.let定 ...

  6. ES6 第七节 ES6中新增的数组知识(1)

    目录 ES6 第七节 ES6中新增的数组知识(1) 第七节 ES6中新增的数组知识(1) JSON数组格式转换 Array.of()方法: find()实例方法: ES6 第七节 ES6中新增的数组知 ...

  7. ES6,新增数据结构Map的用法

    Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成 ...

  8. ES6,新增数据结构Set的用法

    ES6 提供了新的数据结构 Set. 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 单一数组的去重. let set6 = new S ...

  9. ES6,新增数据结构WeakSet的用法

    WeakSet和Set类似,同样是元素不重复的集合,它们的区别是WeakSet内的元素必须是对象,不能是其它类型. 特性: 1.元素必须是对象. 添加一个number类型的元素. const ws = ...

随机推荐

  1. 在 Ruby 中执行 Shell 命令的 6 种方法

    我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb & ...

  2. springboot与消息(rabbtiMQ)

    1.大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 1.1异步通信 1.2解耦 1.3削峰 2.消息服务中两个重要概念:       消息代理(message broker)和目的地 ...

  3. ROS标定IDS相机

    参考 ROS 相机标定http://blog.csdn.net/ArtistA/article/details/51125560 ROS里的标定程序只要使用了OPNCV的标定程序: opencv 相机 ...

  4. vue生命周期小笔记

    一张图谨记vue每个生命周期的获取状态 beforecreate :可以在这加个loading事件 created :在这结束loading,还做一些初始化,实现函数自执行 mounted : 在这发 ...

  5. 修改数据库中的内容报错:PropertyAccessException:Null value was assinged to a property of primitive type setter of

    错误原因:totalTime的类型为int,数据库中为NULL,int 类型不能赋值为NULL,只能为0,所以报此异常. 解决方案:将totalTime的类型改为Integer,或者初始化为0

  6. sed修改json内容

    1.config.json { "whiteHoleUrl": "http://172.16.80.90/whui/serviceManagement/regist/ne ...

  7. eclipse中maven install提示编码GBK的不可映射字符

    今天在eclipse中使用Maven编译项目源代码时,结果如下了如下的错误 在Java源码中没有提示任何报错,即便是改掉项目编码也是不行,如下图所示:

  8. cron.c

    /* $OpenBSD: cron.c,v 1.39 2007/02/18 23:59:03 jmc Exp $ */ /* Copyright 1988,1990,1993,1994 by Paul ...

  9. HRBUST1200 装修 2017-03-06 15:41 94人阅读 评论(0) 收藏

    装修 hero为了能顺利娶princess ,花了血本,买了个房子,现在决定装修.房子的长度为n米,宽度为3米,现在我们有2种地砖,规格分别是1米×1米,2米×2米,如果要为该教室铺设地砖,请问有几种 ...

  10. Hibernate 之单向多对一映射及其衍生问题

    由于在数据表之间可以通过外键进行关联,在使用Hibernate操作映射到存在关联关系的数据表的对象时,需要将对象的关联关系与数据表的外键关联进行映射. 首先建立hibernate.cfg.xml和会话 ...