文章目录
- 一、map
- 1.特性
- 1.1键值对,键可以是对象。
- 1.2.Map可以接受数组作为参数(批量插入)
- 2.属性和方法
- 3.遍历
- 4. 和其它结构的互转
- 二、set
- 1.特性
- 2.属性和方法
- 3.遍历
- 4.和其他结构互转
- 5.应用
一、map
Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成”[object Object]“。
ES6提供了”值-值“对的数据结构,键名不仅可以是字符串,也可以是对象。它是一个更完善的Hash结构。
1.特性
1.1键值对,键可以是对象。
const map1 = new Map()
const objkey = {p1: 'v1'}map1.set(objkey, 'hello')
console.log(map1.get(objkey))
//hello
1.2.Map可以接受数组作为参数(批量插入)
数组成员还是一个数组,其中有两个元素,一个表示键一个表示值。
[key, value]
const map2 = new Map([['name', 'Aissen'],['age', 12]
])
console.log(map2.get('name'))
console.log(map2.get('age'))
//Aissen
// 12
2.属性和方法
实例方法(基本上同Set):
- set(key, value): 返回的是当前的Map对象,因此可以采用链式写法。
- get(key):读取key对应的键值,如果找不到key,返回undefined。
- has(key)
- delete(key)
- clear()
遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
- keys():返回键名的遍历器。
- values():返回键值的遍历器。
- entries():返回所有成员的遍历器。
- forEach():遍历 Map 的所有成员。
设置键值对,键可以是各种类型,包括undefined,function。
const map4 = new Map();
map4.set('k1', 6) // 键是字符串
map4.set(222, '哈哈哈') // 键是数值
map4.set(undefined, 'gagaga') // 键是 undefinedconst fun = function() {console.log('hello');}
map4.set(fun, 'fun') // 键是 functionconsole.log('map4 size: %s', map4.size)
//map4 size: 4
console.log('undefined value: %s', map4.get(undefined))
//undefined value: gagaga
console.log('fun value: %s', map4.get(fun))
//fun value: fun
链式调用
map4.set('k2', 2).set('k3', 4).set('k4', 5)
console.log('map4 size: %s', map4.size)//7
3.遍历
const map9 = new Map();map9.set('k1', 1);map9.set('k2', 2);map9.set('k3', 3);for (let key of map9.keys()) {console.log(key);}//k1 //k2 //k3
-
map.values() 遍历所有值
-
map.entries() 遍历所有键值对
for (let item of map9.entries()) {console.log(item[0], item[1]);}或者for (let [key, value] of map9.entries()) {console.log(key, value);}
map9.forEach(function(value, key, map) {console.log("Key: %s, Value: %s", key, value);});
forEach有第二个参数,可以用来绑定this。
这样有个好处,map的存储的数据和业务处理对象可以分离,业务处理对象可以尽可能的按职责分割的明确符合SRP原则。
const output = {log: function(key, value) {console.log("Key: %s, Value: %s", key, value);}};map9.forEach(function(value, key, map) {this.log(key, value);}, output);
4. 和其它结构的互转
使用扩展运算符三个点(…)可将map内的元素都展开的数组。
const map10 = new Map();map10.set('k1', 1);map10.set('k2', 2);map10.set('k3', 3);console.log([...map10]);// [ [ 'k1', 1 ], [ 'k2', 2 ], [ 'k3', 3 ] ]
- Array To Map (new Map(arr))
const map11 = new Map([['name', 'Aissen'],['age', 12]])console.log(map11)//Map { 'name' => 'Aissen', 'age' => 12 }
- Map To Object (遍历map)
写一个转换函数,遍历map的所有元素,将元素的键和值作为对象属性名和值写入Object中。
function mapToObj(map) {let obj = Object.create(null);for (let [k,v] of map) {obj[k] = v;}return obj;}const map12 = new Map().set('k1', 1).set({pa:1}, 2);console.log(mapToObj(map12))//{ k1: 1, '[object Object]': 2 }
- Object To Map (遍历对象的属性)
同理,再写一个转换函数便利Object,将属性名和值作为键值对写入Map。
function objToMap(obj) {let map = new Map();for (let k of Object.keys(obj)) {map.set(k, obj[k]);}return map;}console.log(objToMap({yes: true, no: false}))//Map { 'yes' => true, 'no' => false }
- Set To Map (new Map(set))
const set = new Set([['foo', 1],['bar', 2]]);const map13 = new Map(set)console.log(map13)//Map { 'foo' => 1, 'bar' => 2 }
function mapToSet(map) {let set = new Set()for (let [k,v] of map) {set.add([k, v])}return set;}const map14 = new Map().set('k1', 1).set({pa:1}, 2);console.log(mapToSet(map14))//Set { [ 'k1', 1 ], [ { pa: 1 }, 2 ] }
二、set
ES6 提供了新的数据结构 Set。
1.特性
似于数组,但它的一大特性就是所有元素都是唯一的,没有重复。
我们可以利用这一唯一特性进行数组的去重工作。
在向Set加入值时,Set不会转换数据类型,内部在判断元素是否存在时用的类似于精确等于(===)的方法,“2”和2是不同的,
NaN等于其自身。正常情况下不成立
let set8 = new Set()
set8.add(NaN)
set8.add(NaN)
set8.add(2)
set8.add("2")
console.log( set8)//{NaN, 2, "2"}
2.属性和方法
遍历方法(用于遍历成员)
遍历操作,Set 结构的实例有四个遍历方法,可以用于遍历成员:
-
- keys():返回键名的遍历器
- values():返回键值的遍历器
- entries():返回键值对的遍历器
- forEach():使用回调函数遍历每个成员
3.遍历
用Set实例对象的keys(),values(),entries()方法进行遍历。
let set5 = new Set([4, 5, 'hello'])
console.log('iterate useing Set.keys()')
for(let item of set5.keys()) {console.log(item)
}console.log('iterate useing Set.values()')
for(let item of set5.values()) {console.log(item)
}console.log('iterate useing Set.entries()')
for(let item of set5.entries()) {console.log(item[0],item[1])
}
用forEach()遍历
let set = new Set([1,2,3])
set.forEach(function(value) {console.log(value);
});
4.和其他结构互转
let set2 = new Set([4,5,6])console.log('array to set 1:', set2)let set3 = new Set(new Array(7, 8, 9))//{ 4, 5, 6 }console.log('array to set 2:', set3)//{ 7, 8, 9 }
[...set] || Array.from(set)
5.应用
let set6 = new Set([1, 2, 2, 3, 4, 3, 5])console.log([...set6]); //[1, 2, 3, 4, 5]console.log(Array.from(set6));//[1, 2, 3, 4, 5]
let arr1 = [1, 2, 3, 4]let arr2 = [2, 3, 4, 5, 6]let set7 = new Set([...arr1, ...arr2])console.log(Array.from(set7));//[1, 2, 3, 4, 5, 6 ]
本文链接:https://blog.csdn.net/qq_39903567/article/details/115210548