es6新特性-Set和Map数据结构
来源:互联网 发布:华为acl允许端口 编辑:程序博客网 时间:2024/06/05 17:33
Set和Map数据结构
Set 本身是一个构造函数,用来生成 Set 数据结构。Set 结构不会添加重复的值。
Set 函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。
// 例一const set = new Set([1, 2, 3, 4, 4]);[...set]// [1, 2, 3, 4]// 例二const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);items.size // 5// 例三function divs () { return [...document.querySelectorAll('div')];}const set = new Set(divs());set.size // 56// 类似于divs().forEach(div => set.add(div));set.size // 56
Array.from方法可以将 Set 结构转为数组。这就提供了去除数组重复成员的另一种方法。
function dedupe(array) { return Array.from(new Set(array));}dedupe([1, 1, 2, 3]) // [1, 2, 3]
Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。
add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
遍历操作:
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法。这意味着,可以省略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 结构。
而且,数组的map和filter方法也可以用于 Set 了。
因此使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。
let a = new Set([1, 2, 3]);let b = new Set([4, 3, 2]);// 并集let union = new Set([...a, ...b]);// Set {1, 2, 3, 4}// 交集let intersect = new Set([...a].filter(x => b.has(x)));// set {2, 3}// 差集let difference = new Set([...a].filter(x => !b.has(x)));// Set {1}
Map数据结构
Map 数据结构类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
const m = new Map();const o = {p: 'Hello World'};m.set(o, 'content')m.get(o) // "content"m.has(o) // truem.delete(o) // truem.has(o) // falseconst map = new Map([ ['name', '张三'], ['title', 'Author']]);map.size // 2//Set和Map可以用来生成新的 Mapconst set = new Set([ ['foo', 1], ['bar', 2]]);const m1 = new Map(set);m1.get('foo') // 1const m2 = new Map([['baz', 3]]);const m3 = new Map(m2);m3.get('baz') // 3
Map 结构转为数组结构,比较快速的方法是使用扩展运算符(…)。
const map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'],]);[...map.keys()]// [1, 2, 3][...map.values()]// ['one', 'two', 'three'][...map.entries()]// [[1,'one'], [2, 'two'], [3, 'three']][...map]// [[1,'one'], [2, 'two'], [3, 'three']]
结合数组的map方法、filter方法,可以实现 Map 的遍历和过滤(Map 本身没有map和filter方法)。
有时候我们会把对象作为一个对象的键用来存放属性值,普通集合类型比如简单对象会阻止垃圾回收器对这些作为属性键存在的对象的回收,有造成内存泄漏的危险。而WeakMap,WeakSet则更加安全些,这些作为属性键的对象如果没有别的变量在引用它们,则会被回收释放掉。
// Weak Mapsvar wm = new WeakMap();wm.set(s, { extra: 42 });wm.size === undefined// Weak Setsvar ws = new WeakSet();ws.add({ data: 42 });//因为添加到ws的这个临时对象没有其他变量引用它,所以ws不会保存它的值,也就是说这次添加其实没有意思
- es6新特性-Set和Map数据结构
- ES6 -- 新的数据结构:Set和Map
- es6 set和map数据结构
- 自学-ES6篇-Set和Map数据结构
- es6常见属性Set和Map数据结构
- ES6的数据结构set 和 map
- ES6之Set和Map数据结构
- ES6 —(Set 和 Map 数据结构)
- ES6-新数据结构Map
- 【ES6】set和map
- 【es6】Set 和 Map
- ES6--Set 和 Map
- ES6入门——Set和Map数据结构
- ES6学习笔记(五)Set和Map数据结构
- ES6学习之路~~数据结构:set和map
- ES6中Set和Map数据结构的基本概念及应用
- ES6-Set 和 Map 数据结构(ECMAScript 6 入门笔记)
- ES6学习10章:Set和Map数据结构
- HDU 4424 Conquer a New Region【并查集】【思维题】
- 2111: [ZJOI2010]Perm 排列计数
- SOA标准之----SCA架构思想
- javaWeb过滤器
- 归并排序
- es6新特性-Set和Map数据结构
- Heroku创始人Adam Wiggins发布十二要素应用宣言
- JavaWeb学习总结(八)——HttpServletResponse对象(二)
- socket通信---UDP通信
- Linux系统编程——进程替换:exec 函数族
- bzoj1857: [Scoi2010]传送带
- 单链表的面试题
- 不改变数组里的数据查找数组的重复值
- 575. Distribute Candies