【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记

简介: 【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记
一、Set对象

概念:Set:类似于数组,但是成员的值是唯一的,不允许重复,允许添加任意类型的值,包括原始值和对象。

  1. 如何创建set数据结构?set本身就是一个构造函数,创建此构造函数的实例对象就是在创建set数据结构。

也就是跟数组使用new创建的方式一样。

var s=new Set();//没有值·
  1. set数据结构还可以接受一个数组作为参数,用来初始化。
var s=new Set([2,3,4]);//没有值
//注意:如果直接打印s,则会输出如下:
//Set(4) {3, 2, 4, 5},也就是它长得像对象,展开如下图所示

  1. 作用:可利用set的特性(不允许重复)做数组去重 等操作。
1、去重
var s=new Set([3,2,3,4,5,4]);
var arr=[...s];//[3,2,4,5]
2、并集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]); // {1, 2, 3, 4}
3、交集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var intersect = new Set([...a].filter(x => b.has(x))); // {2, 3}
4、差集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var difference = new Set([...a].filter(x => !b.has(x))); // {1}
二、Set对象常用属性和方法

  1. 属性 size
    类似于数组的length属性,注意不会将重复的计算在内。
var s=new Set([3,2,3,4,5,4]);
console.log(s.size);//4

  1. 添加某个值,返回 Set 结构本身
// 创建 Set
const letters = new Set();
// 向 Set 添加一些值
letters.add("a");
letters.add("b");
letters.add("c");
//注意:如果添加相等的元素,则只会保存第一个元素
//删除某个值,返回一个布尔值,表示删除是否成功
语法:
Set实例.delete(要删除的值);
//比如:
const s = new Set([1,2,3]);
var boo=s.delete(1);
console.log(boo);//true
//---对比对象的delete方法---
var obj={
    name:'张三'
}
delete obj.name
console.log(obj);//{}
//删除全部,没有返回值
const s = new Set([1,2,3]);
s.clear();
console.log(s.size);//0
//----在JS的本地存储中也有个clear方法,用于清空所有的本地存储--
localStorage.clear();

  1. 没有直接的方法。但有两种变通方法。一种是利用原 Set 结构映射出一个新的结构,然后赋值给原来的 Set 结构;另一种是利用Array.from方法。
// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6
// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));

  1. 查找单个,没有直接的方法。可以通过Set的遍历方法查找所有。
    Set.prototype.keys():返回键名的遍历器
    Set.prototype.values():返回键值的遍历器
    Set.prototype.entries():返回键值对的遍历器
    Set.prototype.forEach():使用回调函数遍历每个成员
    由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
//keys(),values(),entries()
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"]
  1. 判断
    使用has方法判断,返回一个布尔值,表示某个值是否在 WeakSet 实例之中。
const s = new Set([1,2,3]);
//例子
s.has(1) // true
s.has(2) // true
s.has(5) // false
s.delete(2);
s.has(2) // false
三、Map对象

有了Set基础后,再来看Map,会清晰很多。Map类似于对象,是一个存储键值对的集合,但是‘键’’的范围不仅仅是字符串,所有类型的值包括对象都可以当做键。也就是它是用来解决Object的属性名只能是字符串的痛点问题。

创建Map集合有两种:

  1. 直接new Map()创建实例对象;
  2. 接收一个数组作为参数来创建实例对象(该数组的成员必须是一个个表示键值对的数组)
//1、直接创建
let m=new Map();
//2、接收一个数组作为参数来创建Map集合
let m2=new Map([
    ['id',1],  //相当于是Map的键值对
    ['name','张三'],
    ['age',18]
])
四、Map对象的方法和属性

方法和属性基本同Set类似,用法也类似。

方法例举:

  1. has(key); 查找key,返回布尔值
  2. .get(key); 根据key查找value
  3. .set(key,value);添加键值对
  4. .size获取存储的数量
let m2=new Map([
    ['id',1],  //相当于是Map的键值对
    ['name','张三'],
    ['age',18]
])
//添加
m.set('sex','男');
//判断
var flag=m.has('id');
console.log(flag);//true
//获取
var name=m.get('name');
console.log(name);//'张三'
//属性的使用
var len=m.size;
console.log(len);//4
总结:

1、Set数据结构的声明方式分为两种:1、直接实例化一个空的Set()构造函数;2、在Set构造函数中传入一个数组。Set构造函数可以用来做数组去重等操作。

2、Map数据结构的声明方式分为两种:1、直接实例化一个空的Map()构造函数;2、在Map构造函数中传入一个带有键值对的数组。

参考资料

  1. https://www.runoob.com/w3cnote/es6-map-set.html
  2. https://es6.ruanyifeng.com/#docs/set-map
  3. https://www.w3school.com.cn/js/js_object_sets.asp
  4. https://www.imqd.cn/?p=136
相关文章
Set和Map有什么区别?
Set和Map有什么区别?
32 1
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
118 2
在JavaScript中,Set和Map的性能有什么区别?
在JavaScript中,Set和Map的性能有什么区别?
41 0
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
60 0
|
1月前
|
unordered_set、unordered_multiset、unordered_map、unordered_multimap的介绍及使用
unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。前向迭代器的特性。
92 0
用一棵红黑树同时封装出map和set
再完成上面的代码后,我们的底层代码已经完成了,这时候已经是一个底层STL的红黑树了,已经已符合库里面的要求了,这时候我们是需要给他穿上对应的“衣服”,比如穿上set的“衣服”,那么这个穿上set的“衣服”,那么他就符合库里面set的要求了,同样map一样,这时候我们就需要实现set与map了。因此,上层容器map需要向底层红黑树提供一个仿函数,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。我们就可以使用仿函数了。
34 0
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
87 0
ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南
解构赋值是一个强大且灵活的工具,它使得从数组和对象中提取数据变得更加简单和直观。通过掌握解构赋值的基本语法和实践,你可以写出更加简洁、可读性更强的代码。在实际项目中,解构赋值广泛应用于函数参数处理、变量交换、嵌套结构操作等场景,极大地提升了代码的灵活性和简洁度。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
哈希表模拟封装unordered_map和unordered_set
哈希表模拟封装unordered_map和unordered_set
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问