【ES6干货】带你手把手学习js中的Set和Map!!

前言

JavaScript作为一门多用途的编程语言,提供了许多强大的数据结构来处理不同类型的数据。ES6当中加入了许多特性。其中,Set和Map是两个值得注意的数据结构,它们分别用于处理集合和键值对。

今天我们就来学习一下setmap

正文

1. Set的学习

基本介绍

Set是一种集合,它由一组唯一且无序的值组成。与数组不同,Set中的元素没有重复,而且没有固定的顺序。这使得Set非常适合存储不重复的数据。

Set是一种特殊的对象,

长得像数组,但是用的是花括号!!

一个对象中直接装值就是set结构 有下标也可以说下标为key,Set有size属性 ,数组当中可以存放相同的值,然而set中的元素没有重复,其中,Setkey其实和它的value值是相同的!

我们来看一个案例:

js 复制代码
var set = new Set([1,2,3,4,5])//接收的参数是数组
console.log(set);
console.log(set[0]);//读不到值,不能用传统对象和数组的方法来读取值,下标对我们一点用没有
console.log(set.keys());
console.log(set.values());
console.log(set.size);
js 复制代码
输出:
Set(5) { 1, 2, 3, 4, 5 }
undefined
[Set Iterator] { 1, 2, 3, 4, 5 }
[Set Iterator] { 1, 2, 3, 4, 5 }
5

我们在这个案例当中,用Set接收了一个数组,我们会发现!Set的存储方式是这样的Set(5) { 1, 2, 3, 4, 5 }有点像数组,但是用的又是花括号{}存储,Set是一种特殊的存储结构!

Set 对象的 keys()values() 方法都是用于遍历集合中的元素的方法。这两个方法返回一个迭代器对象,通过该对象可以按插入顺序遍历 Set 中的所有元素。

set.keys() 返回一个包含集合中所有键的迭代器对象。

set.values() 返回一个包含集合中所有值的迭代器对象。

什么是迭代器对象?

迭代器对象(Iterator Object)是一种用于遍历数据集合的对象。它提供了一种统一的访问机制,可以逐个访问集合中的元素,而无需关心底层数据结构的具体实现细节。

这里我们只需要了解到Set具有迭代器属性即可!

同时Set又具有size属性,可以通过set.size来获取set的长度!

我们接下来通过一个案例来了解一下Set的没有重复项的特性和size属性!

js 复制代码
let set = new Set([1,1,2,2,3,4])
set.add(5)
console.log(set);//输出:Set(5) { 1, 2, 3, 4, 5 }
console.log(set.size);//输出: 5

我们可以看到,尽管我们给set中传的数组是有重复项的,但是我们通过add一个5之后,再输出发现set所有的项目当中没有重复项,并且可以通过size属性获取大小!

我们再看一个案例:

js 复制代码
//数组去重 能去字符串,数字,不能去对象,函数
var arr = [1,2,3,2,1,4,'a','a']
function unique(arr){
    let s = new Set(arr)
    let result = Array.from(s)//把一个`set`转换为数组
    return result
}
console.log(unique(arr));//[ 1, 2, 3, 4, 'a' ]

我通过这个案例就发现!我们可以通过set对数组进行去重!包括字符串,数字!但是Set无法去重对象和函数!(大家可以动手实操一下!)

Set常用的一些方法

1. 创建Set

使用new Set()可以创建一个空的Set,也可以在创建时传入一个可迭代对象,初始化Set的元素。

js 复制代码
// 创建一个空的Set
let mySet = new Set();
// 创建包含元素的Set
let mySetWithValues = new Set([1, 2, 3, 4, 5]);

2. 添加元素

使用add方法向Set中添加元素,确保元素的唯一性。

js 复制代码
mySet.add(6);

3. 删除元素

使用delete方法删除Set中的指定元素,如果元素不存在,删除操作不会产生错误。

js 复制代码
mySet.delete(3);

4. 检查元素是否存在

使用has方法检查Set中是否存在指定元素,返回布尔值。

js 复制代码
console.log(mySet.has(2)); // 输出: true

5. 获取Set的大小

使用size属性获取Set中元素的个数。

js 复制代码
console.log(mySet.size); // 输出: 6

6. 清空Set

使用clear方法清空Set中的所有元素。

js 复制代码
mySet.clear();

7. 迭代Set元素

可以使用forEach方法或者for...of循环来迭代Set中的元素。Set具有迭代器(Iterator)属性

js 复制代码
// 使用 forEach 迭代
mySet.forEach((item,index,set) => {
  console.log(item,index,set);
});

// 使用 for...of 迭代
for (let value of mySet) {
  console.log(value);
}

8. 将Set转为数组

使用Array.from或者扩展运算符(...)可以将Set转为数组。

js 复制代码
let myArray = Array.from(mySet);
// 或者
let myArraySpread = [...mySet];

9. 合并两个Set

可以使用Set的构造函数和...运算符来合并两个Set。

js 复制代码
let set1 = new Set([1, 2, 3]);
let set2 = new Set([3, 4, 5]);
let mergedSet = new Set([...set1, ...set2]);

10. 获取Set中的所有键、值和键值对

使用keysvaluesentries方法可以分别获取Set中的所有键、所有值以及所有键值对。keys是用来返回所有键名的,具有迭代器属性value是用来返回所有的键值的,也具有迭代器属性

js 复制代码
let setKeys = mySet.keys();
let setValues = mySet.values();
let setEntries = mySet.entries();

11. 判断两个Set是否相等

可以通过比较两个Set的大小和内容来判断它们是否相等。

js 复制代码
function areSetsEqual(set1, set2) {
  if (set1.size !== set2.size) {
    return false;
  }

  for (let item of set1) {
    if (!set2.has(item)) {
      return false;
    }
  }

  return true;
}

14. 获取Set的键值对的另外一种方法

我们可以通过entries()获取Set的键值对

js 复制代码
let set = new Set([1,2,3]);
// entries()即返回键名又返回键值
for(let item of set.entries() ){
    console.log(item);//输出[ 1, 1 ],[ 2, 2 ],[ 3, 3 ]
}

2. Map的学习

基本介绍

在JavaScript中,Map是一种集合数据结构,用于存储键值对。它提供了一种更灵活且功能丰富的方式来处理和存储数据,相较于普通的对象(Object),Map具有一些独特的特点。

我们Map的初始化要用二维数组!

在对象当中,存储是以键值对的形式存储!但是对象的键值只能是数字和字符串!

Map就相当于进阶版的对象,它的键值能够是任意类型的数据!!

我们用一个案例来学习一下:

js 复制代码
//map的key可以是任意数据结构
//初始化要用二维数组
let map = new Map([
    ['name','老王']
])
let obj = {a:1}
map.set(obj,'hello')//key是一个对象,value是一个字符串,用箭头给你表达
map.get('name')//读到map里面key为name的值
// 引用数据类型引用的是地址,类型相等,引用地址相等,值相等,才叫相等
console.log(map.get(obj));
map.forEach((item,index,map)=>{
console.log(map);
})

输出:
hello
Map(2) { 'name' => '老王', { a: 1 } => 'hello' }
Map(2) { 'name' => '老王', { a: 1 } => 'hello' }

在我们这个案例当中,我们先初始化了一个Map的实例对象!注意:Map初始化要用二维数组!!

其中,存了一个['name','老王'],这里面的值我们不能随意去设置,要符合key-value的形式。

接着,我们又声明了一个对象obj,这里我利用了setMap添加值,其中keyobj对象,value值'hello',

我们又有一个get(name)方法获取Mapkeyname的值!!后面打印了keyobj对象的值为hello

同时Map也具有迭代器属性!我们记住就好!我们也可以用forEach((item,index,map)Map进行遍历!

Map常用方法

Map的常用反法

1. 解构Map

js 复制代码
console.log([...map]);//输出还是二维数组

2. 添加

js 复制代码
map.set(key,value)

3. 获取对应key的值

js 复制代码
map.get(key)

4. 遍历Map

js 复制代码
map.forEach((item,index,map)=>{
console.log(map);
})
// 使用 for...of 遍历 Map
for (let [key, value] of myMap) {
    console.log(key, value);
}

其他方法与set大概相同!!大家可以去了解学习一下!

讲了那么久,我们总是听到迭代器这个属性!

迭代器属性

在 JavaScript 中,SetMap 类型都有一些迭代器属性,使得你可以通过不同的方式遍历它们。

Set 的迭代器属性:

  1. Set.prototype.keys() 返回一个包含集合中所有值的迭代器对象。
  2. Set.prototype.values()keys() 方法相同,返回一个包含集合中所有值的迭代器对象。
  3. Set.prototype.entries() 返回一个包含集合中所有值的迭代器对象,每个元素都是一个 [value, value] 形式的数组。

Map 的迭代器属性:

  1. Map.prototype.keys() 返回一个包含 Map 中所有键的迭代器对象。
  2. Map.prototype.values() 返回一个包含 Map 中所有值的迭代器对象。
  3. Map.prototype.entries() 返回一个包含 Map 中所有键值对的迭代器对象,每个元素都是一个 [key, value] 形式的数组。

这些迭代器属性使得遍历 SetMap 变得更加方便,可以使用 for...of 循环或者其他迭代方式来访问集合中的元素。

好啦! 我们今天的学习就到这里啦!大家有想法的欢迎留言评论!! 点个小赞鼓励支持一下吧!!

相关推荐
吃杠碰小鸡1 小时前
commitlint校验git提交信息
前端
虾球xz1 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇1 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒2 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员2 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐2 小时前
前端图像处理(一)
前端
程序猿阿伟2 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒2 小时前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪2 小时前
AJAX的基本使用
前端·javascript·ajax
力透键背2 小时前
display: none和visibility: hidden的区别
开发语言·前端·javascript