Es6 中的 Set 和 Map
- Set 和 Map 他们只是一个新的储存数据的方法 它们既不是对象也不是啥数组 它们就是它们自己。它们自身都有着操作自身结果的方法。
new set()
- Set 本身是一个构造函数,用来生成 Set 数据结构, Set 它类似于数组(但它不是数组),Set 的成员的值都是唯一的,没有重复的值,也常用他来去重(不可以传递对象)。向 Set 加入值的时候,不会发生类型转换,所以 5 和"5"是两个不同的值
const arr = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
//传入数组返回不会存在相同成员的数组,
console.log(arr); // [1, 2, 3, 4, 5] set数据结构不会出现相同的成员
arr.size; // 5 size方法得到set结构中成员的数量
Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)
操作方法
add(value); //添加某个值,返回Set结构本身。
delete value; //删除某个值,返回一个布尔值,表示删除是否成功。
has(value); //返回一个布尔值,表示该值是否为Set的成员。
clear(); //清除所有成员,没有返回值。
遍历方法
keys(); //返回键名的遍历器
values(); //返回键值的遍历器
entries(); //返回键值对的遍历器
forEach(); //使用回调函数遍历每个成员
new Map()
- 传统的 JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。而 ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
const m = new Map();
const o = { p: "Hello World" };
m.set(o, "content"); //以一个对象作为键名
m.get(o); // "content"
m.has(o); // true
m.delete(o); // true
m.has(o); // false
map 的数据结构
- 作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组
//往map里添加成员
const map = new Map([
["name", "张三"],
["title", "Author"],
]);
map.size; // 2
map.has("name"); // true
map.get("name"); // "张三"
map.has("title"); // true
map.get("title"); // "Author"
操作方法
add(value); //添加某个值,返回Set结构本身。
delete value; //删除某个值,返回一个布尔值,表示删除是否成功。
has(value); //返回一个布尔值,表示该值是否为Set的成员。
clear(); //清除所有成员,没有返回值。
遍历方法
keys(); //返回键名的遍历器
values(); //返回键值的遍历器
entries(); //返回键值对的遍历器
forEach(); //使用回调函数遍历每个成员
Map 数据转换成数组
const myMap = new Map().set(true, 7).set({ foo: 3 }, ["abc"]);
[...myMap];
// [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
数组 转为 Map
new Map([
[true, 7],
[{ foo: 3 }, ["abc"]],
]);
// Map {
// true => 7,
// Object {foo: 3} => ['abc']
// }
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
let obj = { a: 1, b: 2 };
let map = new Map(Object.entries(obj));
小栗子
- 适用于 多种类型 但执行方法都是一样的
let map = new Map()
map.set([2, 3, 4, 5], function () { console.log('我是2 3 4 方法') })
map.set( 5 , function () { console.log('我是5 方法') });
let num = 5 // 传递类型 执行对应的方法
for (let [key, value] of map) { // 循环map对象得到对应的 建(key) 值(value)
if (key instanceof Array) { // 判断是不是数组
if (key.includes(num)) { // 数组中是否包括 num
value()
}
}
if (key === num) { // 是否等于num
value()
}
}