Map
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。 作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
练习
let a = new Map([ ['name', 'leo'], ['age', 18]])for (let i of a.keys()) { console.log(i)};//name //agefor (let i of a.values()) { console.log(i)};//leo //18for (let i of a.entries()) { console.log(i)};//["name", "leo"]a.forEach((v, k, m) => { console.log(`key:${k},value:${v},map:${m}`)})//key:name,value:leo,map:[object Map]//key:age,value:18,map:[object Map]复制代码
let a = new Map();let b = {name: 'leo' };a.set(b,'my name'); // 添加值a.get(b); // 获取值a.size; // 获取总数a.has(b); // 查询是否存在a.delete(b); // 删除一个值a.clear(); // 清空所有成员 无返回const m = new Map();m.set('edition', 6) // 键是字符串m.set(262, 'standard') // 键是数值m.set(undefined, 'nah') // 键是 undefined复制代码
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']]复制代码
const map0 = new Map() .set(1, 'a') .set(2, 'b') .set(3, 'c');const map1 = new Map( [...map0].filter(([k, v]) => k < 3));// 产生 Map 结构 {1 => 'a', 2 => 'b'}const map2 = new Map( [...map0].map(([k, v]) => [k * 2, '_' + v]) );// 产生 Map 结构 {2 => '_a', 4 => '_b', 6 => '_c'}复制代码
- Map 转为数组 前面已经提过,Map 转为数组最方便的方法,就是使用扩展运算符(...)。
const myMap = new Map() .set(true, 7) .set({foo: 3}, ['abc']);[...myMap]// [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]复制代码
- 数组 转为 Map 将数组传入 Map 构造函数,就可以转为 Map。
new Map([ [true, 7], [{foo: 3}, ['abc']]])// Map {// true => 7,// Object {foo: 3} => ['abc']// }复制代码
- Map 转为对像 若map键都是字符串,它可以无损地转为对象。
function strMapToObj(strMap) { let obj = Object.create(null); for (let [k,v] of strMap) { obj[k] = v; } return obj;}const myMap = new Map() .set('yes', true) .set('no', false);strMapToObj(myMap)// { yes: true, no: false }复制代码
- 对象转为 Map
function objToStrMap(obj) { let strMap = new Map(); for (let k of Object.keys(obj)) { strMap.set(k, obj[k]); } return strMap;}objToStrMap({yes: true, no: false})// Map { "yes" => true, "no" => false}复制代码
keys():返回键名的遍历器。 values():返回键值的遍历器。 entries():返回所有成员的遍历器。 forEach():遍历 Map 的所有成员。
set
Set函数接受数组作为参数,是接受类似数组的对象作为参数。Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。
- add(value):添加某个值,返回 Set 结构本身
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- has(value):返回一个布尔值,表示该值是否为Set的成员。
- clear():清除所有成员,没有返回值。
s.add(1).add(2).add(2);// 注意2被加入了两次s.size // 2s.has(1) // trues.has(2) // trues.has(3) // falses.delete(2);s.has(2) // false复制代码
let b = new Set([1, 2, 3, 3, 4]); console.log(b);//Set(4) {1, 2, 3, 4} console.log(...b);//将对象序列化 1 2 3 4 console.log([...b]);//(4) [1, 2, 3, 4] //Array.from方法可以将 Set 结构转为数组。 const array = Array.from(b); console.log(array);//(4) [1, 2, 3, 4]复制代码
这里需要注意,Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。
for (let item of set.entries()) { console.log(item);}//item [key,value]// ["red", "red"]// ["green", "green"]// ["blue", "blue"]let set = new Set([1, 4, 9]); set.forEach((value, key) => console.log(key + ' : ' + value))// 1 : 1// 4 : 4// 9 : 9复制代码
参考:阮一峰ES6