共计 2635 个字符,预计需要花费 7 分钟才能阅读完成。
Map 和 Set
Map 定义:一组键值对的集合
它是一组键值对的数据结构,由于之前 javascript 的键(key)必须是字符串。为了使键可以是多种类型的于是在最新的 es6 中引入了 map 这种数据结构,这样可以加快查询速度,类似于查字典
方法和属性
var m = map() // 空 map
m.set(‘ 学生年龄 ’,6) // 添加一对新的 key-value
m.has(‘ 学生年龄 ’) // 是否存在 key 学生年龄 true
m.get(‘ 学生年龄 ’) // 拿到值 6
m.delete(‘ 学生年龄 ’) // 删除 key 学生年龄
m.clear() // 清除所有成员 没有返回值
m.size() // 返回 map 结构的成员总数 1
需要注意的是如果多次对相同 key 值插入 value,前一次的 value 值会被覆盖
map 中的键实际是对内存地址的引用,举例说明
var k1 = 222;
var k2 = 222;
map
.set(k1, 123);
.set(k2, 222);
map.get(k1); // 123
map.get(k2); // 222
因此如果键值是对象的话就算值相同也是两个不同的键,如果是简单类型的话(number,boolean,string),只要值相等,就是同一个键,0 和 - 0 也被 map 视为同一键,NaN 也是同一键
遍历 map 的方法
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回所有成员的遍历器
forEach():遍历所有 map 成员
map 遍历的顺序就是插入的顺序
使用实例
var m = new map(
[‘F’, ‘no’],
[‘t’, ‘yes’]
);
for(let key of map.keys()) {
console.log(key);
}
// f,t
for(let key of map.values()) {
console.log(key);
}
// no, yes
for(let key of map) {
console.log(key[0], key[1]);
}
// f no
// t yes
map.forEach(res => {
console.log(res[0], res[1]);
});
// f no
// t yes
forEach 方法还可以接受第二个参数,用来绑定 this。
类型转换
[] map 如何转换为数组
运用扩展运算符可以很方便的转换
var m = map;
m.set(‘a’, 1);
m.set(‘b’, 2);
[…map];
// [[‘a’,1], [‘b’,2]];
[] 数组转换为 map
new Map([[true, 7], [{foo: 3}, [‘abc’]]])
// Map {true => 7, Object {foo: 3} => [‘abc’]}
[] map 转化为对象
如果键都是字符串
function mapToObj(strMap) {
let obj = Object.create(null);
for(let [k,v] of strMap) {
obj[k] = v
}
return obj;
}
let map = new Map().set(‘yes’,111);
mapToObj(map);
// {yes: 111};
[] 对象转为 map
function objToMap(obj) {
let map = new Map();
for(let k of obj.keys()) {
map.set(k.obj[k]);
}
return map;
}
objToStrMap({yes: true, no: false});
// [[ ‘yes’, true], [‘no’, false] ]
[] map 转化为 json
如果 map 键名都是字符串的话,可以转化为对象 json
function mapToJson(strMap) {
return JSON.stringify(mapToObj(strMap)); // map 转化为对象在转化为 json
}
let map = new Map().set(‘yes’, 111);
strMapToJson(myMap)
// ‘{“yes”:true,”no”:false}’
如果键名时非字符串的话,转化为数组 json
function mapToJson1(strMap) {
return JSON.stringify([…strMap]); //map 转化为数组在转化为数组 json
}
let myMap = new Map().set(true, 7).set({foo: 3}, [‘abc’]);
mapToArrayJson(myMap)
// ‘[[true,7],[{“foo”:3},[“abc”]]]’
json 转化为 map 同理只是 return 的是 JSON.parse() 方法 也分为键名是字符串和非字符串
Set
特点
类型于数组。但是它的成员值都是唯一的,可以用来做数组去重
构造函数
var a = new Set([1,2,2,3,4,555,5,5,6]);
[…a];
// [1,2,3,4,555,6];
这是一个数组去重的例子在 set 内部如果有两个 NAN 会去掉一个
方法
add(value): 添加值 返回 set 结构本身
delete(value):删除某个值 返回布尔值 表示是否删除成功
has(value):返回布尔值 表示该值是否为 set 的成员
clear():清除所有成员
数组去重的两种方法
var arr = [1,2,3,4,4,5];
var aSet = new Set(arr);
[…aSet];
//[1,2,3,4,5]
var bSet = new Set(arr);
arr = Array.from(bSet); // [1,2,3,4,5]
由于 set 的 keys()和 values()完全一样所以无法通过 set[xxx] 的方式找到其内部的值,
遍历 set 的方法
keys():返回键名和遍历器
values():返回键值和遍历器
entires():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
let set = new Set([‘red’, ‘green’, ‘blue’]);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// [“red”, “red”]
// [“green”, “green”]
// [“blue”, “blue”]
forEach 对空数组不会执行回调函数