ES6之Set和Map

定义

  • 集合数据结构:Array,Object,Map,Set
  • Set类似于数组,Map类似于对象
  • Set成员唯一,Map键的范围不限于字符串
// Set成员唯一,
var set = new Set([1, 2, 3, 1, 2])  //Set { 1, 2, 3 }

//Map键的范围不限于字符串
var obj1 = {}
var obj2 = {}
var obj = { [obj1]: 1, [obj2]: 2 }      //{ '[object Object]': 2 },使用'[object Object]'作key

var map = new Map()
map.set(obj1, 1)
map.set(obj2, 2)                //Map { {} => 1, {} => 2 }

原型成员(基本)

  • Set、Map通用
    • 成员总数:size
    • 删:delete,返回布尔值
    • 包含:has
    • 清除:clear,无返回值
  • Set
    • 增:add,返回本身
  • Map
    • 查:get
    • Hash结构,值-值
    • 增:set,返回本身
//基本操作,增删查..
//Set
var s = new Set().add(1).add(2).add(2)   // Set { 1, 2 }
s.size              //2
s.delete(1)         //true
s.size              //1
s.has(2)            //true
s.clear()           //undefined, s: Set {}

//Map
var o1 = {}
var o2 = {}
var m = new Map().set(o1, 1).set(o2, 2).set(1, 'a')     //Map { {} => 1, {} => 2, 1 => 'a' }
m.size                      //3
m.delete(o1)                //true, m: Map { {} => 2, 1 => 'a' }
m.has(o1)                   //false
m.get(o2)                   //2
m.set(o2, 3)                //Map { {} => 3, 1 => 'a' },改
m.clear()           		//undefined, m: Map {}

原型方法(遍历相关)

  • keys,values,entries (返回遍历器对象,for…of遍历)
  • forEach(类似数组)
//原型方法(遍历相关)
//keys,values,entries (返回遍历器对象,for...of遍历)
var a = new Set([1, 2, 3])
a.keys()           //[Set Iterator] { 1, 2, 3 }
Set.prototype[Symbol.iterator] === Set.prototype.values     //true
Set.prototype.keys === Set.prototype.values                 //true
for (let v of a) {      //1  2  3,遍历器调用values
     console.log(v)
}

注意

  • Set参数:可遍历(iterable)
  • Set/Map遍历顺序是插入顺序(类似数组)
  • Map参数:可遍历,双元素
  • Map:同一键引用相同(地址)

//参数
//Set参数可遍历
var a = new Set('123451243')    //Set { '1', '2', '3', '4', '5' }
    ;[...a].join('')                //"12345", 字符串去重

//Map参数:可遍历,且每项为双元素
var m = new Map([[1, 2]])       //Map { 1 => 2 },和下行类似
var m = new Map().set(1, 2)     //Map { 1 => 2 }


//Map:同一键引用相同(地址)
var o = {}
var m = new Map().set({}, 1).get({})    //undefined
var m = new Map().set(o, 1).get(o)      //1

应用

  • Set、数组互相转化
  • 数组去重
  • 字符串去重
  • 集合取交、并、差集
  • Map与其他结构互转:数组、对象、JSON
// Set、数组互相转化,去重
var s = new Set('1231')
var a = [...s]          //[ '1', '2', '3' ]
s = new Set(a)          //Set { '1', '2', '3' }

/**
 * 1. Set取交集、并集、差集
 * 2. 扩展运算符(...)内部使用for...of循环
 * 3. Set转为Array,可使用Array方法
 */
var s1 = new Set([1, 2])
var s2 = new Set([2, 3])
var s = new Set([...s1, ...s2])     //Set { 1, 2, 3 }, 并集
var s = [...s1].filter(x => s2.has(x))      //[ 2 ], 交集
var s = [...s1].filter(x => !s2.has(x))      //[ 1 ], 差集


/**
 * 1.  Map与其他结构互转:数组、对象、JSON
 * 2. 对象增加iterator接口
 */
var m = new Map().set(1, 1)

var a = [...m]      //[ [ 1, 1 ] ], Map->数组
m = new Map(a)      //Map { 1 => 1 }, 数组->Map

var o = {}
for (let [k, v] of m) {     //{ '1': 1 }, Map->对象
    o[k] = v
}

m = new Map()
for (let key in o) {        //Map { '1' => 1 }, 对象->Map
    m.set(key, o[key])
}


var s = JSON.stringify(o)       //{"1":1},Map->对象->JSON


m = new Map([[true, 1], [{}, 1]])   //键非字符串
s = JSON.stringify([...m])          //[ [ true, 1 ], [ {}, 1 ] ],Map->数组->JSON

//JSON -> Map同理:JSON->对象/数组->Map

WeakSet和WeakMap

  • 类似Set/Map
  • 成员只能是对象
  • 弱引用,垃圾回收机制
  • 内存泄漏:不再用到的内存,没有及时释放
  • 原型方法:get、set、has、delete(无遍历操作,无size,clear)
//WeakSet和WeakMap
//Set值和Map键必须是对象
var s = new WeakSet('11')       //Invalid value used in weak set
var m = new WeakMap().set(1, 1)     //Invalid value used as weak map key

WeakSet.prototype       //add,delete,has,无遍历,clear,size
WeakMap.prototype       //delete,get,has,set,无遍历,clear,size


/**
 * 1. 内存泄漏的解决
 * 2. 手动释放, 赋值null
 * 3. 弱引用: Weak结构.不计入垃圾回收机制
 * 3. 垃圾回收机制:引用计数(引用为0,释放内存)
 */
var o = {}
o = null

var w = new WeakMap();
o = {}

w.set(o, "ooo");
### ES6Set Map 的使用教程 #### 关于 Set Set 是一种集合数据结构,其成员是唯一的且无序。这意味着在一个 Set 对象中不会存在两个相同的值。 创建一个新的 `Set` 可通过调用构造函数来实现: ```javascript let set = new Set(); set.add(1); set.add('string'); console.log(set.has(1)); // true ``` 对于已经存在的可迭代对象(比如数组),也可以直接传入到 `Set()` 构造器内初始化一个新集合作为参数[^2]。 关于 `Set` 实例的一些常用方法如下所示: - `.add(value)` 添加某个值作为新的条目; - `.delete(value)` 移除指定的条目; - `.has(value)` 判断是否存在某特定条目的布尔返回值; - `.clear()` 清空整个集合中的所有元素; 另外还有几个有用的属性方法用于获取当前集合大小以及遍历其中的内容,例如`.size`, `.entries()`, `.values()`, `.keys()` 等等[^3]。 #### 关于 Map Map 数据结构允许任何类型的键名而不仅仅是字符串或 Symbols 类型,并能保存键/值对关系。这使得它非常适合用来存储关联性的数据。 创建一个新的 `Map` 同样可以通过构造函数完成: ```javascript const map = new Map([ ['key1', 'value associated with key1'], ['key2', 'value associated with key2'] ]); ``` 上述代码片段展示了如何利用二维数组的形式一次性向映射表里添加多个键值对[^1]。 有关 `Map` 实例的操作还包括但不限于以下几个方面: - 获取键的数量:`map.size`; - 设置键对应的值:`map.set(key,value)`; - 查找给定键所对应之值:`map.get(key)`; - 删除指定键及其关联的数据项:`map.delete(key)`; - 测试是否含有某一键:`map.has(key)`; 值得注意的是,在某些情况下可能需要把 `Map` 转换成 JSON 格式的字符串以便在网络上传输或者持久化保存。此时可以先借助 `Object.fromEntries()` 函数将 `Map` 映射成普通的 JavaScript 对象再进一步处理[^4]: ```javascript // 将 Map 转换为 JSON 字符串的例子 const myMap = new Map([['name', 'Alice'], ['age', 18]]); const objFromMap = Object.fromEntries(myMap); const jsonString = JSON.stringify(objFromMap); console.log(jsonString); // {"name":"Alice","age":18} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值