Es6 中的 Set 和 Map

本文介绍了ES6中的Set和Map数据结构,Set用于存储唯一值,Map则支持任意类型键。讲解了Set的创建、去重、操作方法和遍历方式,以及Map的键值对存储、对象作为键、操作和遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()
    }
}
文章来源于 阮一峰的 ES6 入门教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值