Map and Set(映射和集合)

JavaScript教程|Map and Set(映射和集合),迭代键,过滤字谜, Map —— 是一个带键的数据项的集合。方法和属性如下:new Map([iterable]) —— 创建 map,可选择带有 [key,value] 对的 iterable(例如数组)来进行初始化。map.set(key, value) —— 根据键存储值,返回 map 自身。map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined。map.has(key) —— 如果 key 存在则返回 true,否则返回 false。 阅读详情

JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object)。
在ES6,引入了Map 和 Set。

Map

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为键或值。(请查看mdn)

从定义上来看,Map 是一个带键的数据项的集合,就像一个 Object 一样。

Map的方法和属性

  • new Map() —— 创建 map。
  • map.set(key, value) —— 根据键存储值。
  • map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined。
  • map.has(key) —— 如果 key 存在则返回 true,否则返回 false。
  • map.delete(key) —— 删除指定键的值。
  • map.clear() —— 清空 map。
  • map.size —— 返回当前元素个数。
let map = new Map();

map.set("string", "str1");   // 字符串键
map.set(1, "Number");     // 数字键
map.set(true, "Boolean"); // 布尔值键
map.set({"键名": "键值"}, "Object");  // 使用对象作为键
map.set(function() {}, "Function");  // 使用方法作为键

// 还记得普通的 Object 吗? 它会将键转化为字符串
// Map 则会保留键的类型,所以下面这两个结果不同:
console.log( map.get(1)); // 'num1'
console.log( map.get('1') ); // 'str1'
console.log( map.size ); // 5

Map 和 Object 都允许按键存取一个值、删除键、检测一个键是否绑定了值。

Map和Object的区别

  1. Object 只能接收两种类型的键名:String 和 Symbol。
    Map 能够接受任意类型的键名(包括函数、对象或任何原始值)。
let map =new Map();
// 链式调用
map.set(1, "Number").set(true, "Boolean").set({"键名": "键值"}, "Object")

map.set(function() {}, "Function")
console.log(map);

let obj = {
	1: "Number",
	true: "Boolean",
	[{"键名": "键值"}]: "Object",
	[function() {}]: "Function"
}
console.log(obj)

在这里插入图片描述
在这里插入图片描述
虽然说Object 可以接受其他类型的键名,当时js都会隐式地将其转换为字符串

  1. Map是可迭代对象,具备iterator接口,可以直接迭代。
    Object 没有实现可迭代协议,是不能直接进行迭代的。
let map =new Map();
// 链式调用
map.set(1, "Number").set(true, "Boolean").set({"键名": "键值"}, "Object")

map.set(function() {}, "Function")
console.log(map);
for(let it of map) {
	console.log(it)
}
  1. Map可以通过map.size()直接获取当前元素个数。
    Object不能直接获取。一般是通过 Object.keys() 返回对象中每一项key的数组,来获取当前对象的元素个数。

Map 迭代

如果要在 map 里使用循环,可以使用以下三个方法:

  • map.keys() —— 遍历并返回一个包含所有键的可迭代对象。
  • map.values() —— 遍历并返回一个包含所有值的可迭代对象。
  • map.entries() —— 遍历并返回一个包含所有实体 [key, value] 的可迭代对象。
// Map初始化要用二维数组
let map = new Map([
  ["string", "str1"],
  ["1", "Number"],
  ['tomatoes', 350],
  ['onion',    50]
]);
// 遍历所有的键
for (let vegetable of map.keys()) {
  console.log(vegetable); // string, 1, tomatoes, onion
}

// 遍历所有的值
for (let amount of map.values()) {
  console.log(amount); // str1, Number, 500, 350, 50
}

// 遍历所有的实体 [key, value]
for (let entry of map) { // 与 recipeMap.entries() 相同
  console.log(entry); 
}

// 此外,Map还有内建的forEach方法
// 对每个键值对 (key, value) 运行 forEach 函数
map.forEach( (value, key, map) => {
  console.log(`${key}: ${value}`); 
});

注意:Map初始化要用二维数组!!

Object.entries:从对象Object创建 Map

Object.entries(obj)方法返回对象的键/值对数组,该数组格式就是 Map 所需的格式。

let obj = {
	name: "张三",
	age: 18
}

// Object.entries返回键/值对数组
let objEntries = Object.entries(obj); // [ ["name","张三"], ["age", 18] ]
console.log(objEntries)

let map = new Map(objEntries)
console.log(map)

在这里插入图片描述

Object.fromEntries:从 Map 创建 对象Object

Object.fromEntries 方法:给定一个具有 [key, value] 键值对的数组,它会根据给定数组创建一个对象。
简而言之,使用 Object.fromEntries把键/值对数组转成普通对象(plain object)。

let map = new Map([
	["name", "张三"],
	["age", 18],
])

let obj = Object.fromEntries(map)
console.log(obj)  // {name: '张三', age: 18}

let obj1 = Object.fromEntries(map.entries()); 
console.log(obj1)  // {name: '张三', age: 18}

上面两句代码的作用是一样的,因为 Object.fromEntries 期望得到一个可迭代对象作为参数,而不一定是数组。
Map 的标准迭代会返回跟 map.entries() 一样的键/值对。
因此,我们可以获得一个普通对象(plain object),其键/值对与 map 相同。

Set

Set 对象允许你存储任何类型(无论是原始值还是对象引用)的唯一值。(请查看mdn)

Set 对象是值的合集(collection)。集合(set)中的元素只会出现一次,即集合中的元素是唯一的。
Set 没有键!!

Set是一种特殊的对象,长得像数组,但是用的是花括号!!

let set = new Set(["a", "b", "c"]);
console.log(set); // Set(3) {'a', 'b', 'c'}
console.log(typeof set); // object
console.log(set instanceof Set); // true

Set的方法

  • new Set(iterable) —— 创建一个 set,如果提供了一个 iterable 对象(通常是数组),将会从数组里面复制值到 set 中。
  • set.add(value) —— 添加一个值,返回 set 本身
  • set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false。
  • set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false。
  • set.clear() —— 清空 set。
  • set.size —— 返回元素个数。

因为Set 里面的每一个值只出现一次,所以 重复使用同一个值调用 set.add(value) 并不会发生什么改变。
Set 内部对唯一性检查进行了更好的优化。

let set = new Set();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

// 重复使用一个值调用set.add
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);

// set 只保留不重复的值
console.log(set)
console.log( set.size ); // 3

for (let it of set) {
  console.lot(it.name); // John(然后 Pete 和 Mary)
}

Set 迭代(iteration)

let set = new Set(["oranges", "apples", "bananas"]);

for (let value of set) console.log(value);

// 与 forEach 相同:
set.forEach((value, valueAgain, set) => {
  console.log(value);
});

注意:使用forEach,同一个值在参数里出现了2次。
forEach 的回调函数有三个参数:一个 value,然后是 同一个值 valueAgain,最后是目标对象。
forEach 的回调函数有三个参数,是为了与 Map 兼容。

Map 中用于迭代的方法在 Set 中也同样支持:

  • set.keys() —— 遍历并返回一个包含所有键的可迭代对象。
  • set.values() —— 遍历并返回一个包含所有值的可迭代对象。

因为Set没有键(key),所以keys()与values()返回结果相同。这是为了兼容Map。

let set = new Set(["oranges", "apples", "bananas"]);
console.log(set.keys());  // SetIterator {'oranges', 'apples', 'bananas'}
console.log(set.values()); // SetIterator {'oranges', 'apples', 'bananas'}
  • set.entries() —— 遍历并返回一个包含所有的实体 [value, value] 的可迭代对象。

Set没有键(key),entries()方法返回的是[value, value]值值对,而不是[key, value]键值对,这是为了兼容Map。

let set = new Set(["oranges", "apples", "bananas"]);
console.log(set.entries());  // SetIterator {'oranges' => 'oranges', 'apples' => 'apples', 'bananas' => 'bananas'}

for(let it of set.entries()) {
	console.log(it) // ['oranges', 'oranges'] and so on
}

将Set转为数组

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

let set = new Set(["a", "b", "c"]);
console.log(set); // Set(3) {'a', 'b', 'c'}

let arr = Array.from(set);  // ["a", "b", "c"]
let arr1 = [...set];  // ["a", "b", "c"]

将数组转为Set

// 方法1
let arr = ["a", "b", "c"]
let set = new Set(["a", "b", "c"]);
console.log(set); // Set(3) {'a', 'b', 'c'}

// 方法2:使用map()
let arr1 = [5, 5, 4, 6];
let set1 = new Set();
arr1.map(arrElement => set1.add(arrElement));
console.log(set1); // Set(3) {'a', 'b', 'c'}

合并Set

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

let set1 = new Set(["a", "b", "c"]);
let set2 = new Set([1, 2, 3]);

// 合并set1、set2
let bigSet = new Set([...set1, ...set2]);  // Set(6) {'a', 'b', 'c', 1, 2, 3}

Axure RP 9在Windows 11环境下的高效安装与配置指南 本文提供Axure RP 9在Windows 11系统下的详细安装步骤与配置指南。针对Win11安全特性,从获取官方安装资源、调整系统权限,到定制化安装路径、精准汉化及性能优化,系统性地解决了安装闪退、汉化失败、运行卡顿等常见问题,确保用户获得稳定流畅的原型设计体验。 阅读详情

相关推荐

Xilinx System Generator多速率系统(Multi-Rate Systems)的使用

在本实验练习中,您将学习在System Generator中如何使用多个时钟域有效地实现具有多个数据速率的设计。

白码王子小张的博客 1093

Map和WeakMap Set和WeakSet详解,属性和方法(MDN)

这里写目录标题MapObjects 和 maps 的比较属性方法WeakMap属性方法Set属性方法WeakSet方法判等 Map Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。 描述:一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个for…of循环在每次迭代后会返回一个形式为[key,value]的数组。 键的相等(Key equality) NaN是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据 ==

furfur-jiang的博客 1327

Keil5安装教程(保姆级)Keil5mdk安装步骤

6、复制生成的激活码,粘贴在New License ID Code处,点击Add LIC,即可成功激活mdk,显示mdk的使用期限。6、复制生成的激活码,粘贴在New License ID Code处,点击Add LIC,即可成功激活C51,显示mdk的使用期限;3、在安装文件中点击keygen.exe文件,粘贴复制过的CID,选择Target为C51,点击Generate,生成激活码;4、在弹出的界面中会自动安装在安装keil的路径,点击“Next”进行后续安装,安装完成后,点击“Finish”。

m6886258的博客 9万+

ES6中Map

注意,持有原始对象引用的映射实际上意味着对象不能被垃圾回收,这可能会导致意外的内存问题。如果希望存储在 map 中的对象具有与原始对象相同的生命周期,请考虑使用。中将其用作分组键,则必须在对象改变时维护原始对象和其表示之间的映射。首先,定义一个包含代表各种食品库存的对象的数组。更改元素的内部结构将反映在原始可迭代对象和返回的 Map 中。因为即使对象被修改,它仍将作为返回的 Map 的键继续工作。的键是有序的,但情况并非总是如此,并且其排序比较复杂的。这是一种非常简洁的访问函数中相关元素的值的方式。

weixin_45618535的博客 568

学习海康VisionMaster之顶点检测

2:应用场景:海康VisionMaster的顶点检测功能在工业视觉检测中具有广泛的应用场景,尤其在精密制造、电子元件检测和机械加工等领域,其通过高精度定位物体的关键点(如角点、交点或边缘顶点)来实现自动化测量与质量控制。基本参数这里就是画ROI,设定跟踪参数和之前的工具是一样的方法,这里画的方向需要注意,如下图所示,边缘的扫描方向正好对应需要查找的边缘点。一个不是很规则的物体需要检测一个凸台的顶角坐标,其实靠边缘与边缘交点是不太稳定的,如下图所示,边缘很短,很容易产生误抓边缘。1:什么是顶点检测?

yuhouxiyang的专栏 1524

Qwen3-Embedding选型指南:0.6B/4B/8B三版本性能对比与场景匹配建议

本文深入解析阿里开源的Qwen3-Embedding系列模型(0.6B/4B/8B)的性能差异与适用场景,提供从边缘计算到云端部署的实战选型建议。通过实测数据对比响应延迟、内存占用和多语言精度等核心指标,帮助技术团队根据业务需求选择最优模型版本,并分享边缘设备优化与云端成本测算策略。

qsc901234567的博客 892

Object/Function/Boolean/Symbol/Map-mdn

JS标准-内置对象基本对象 Object 创建对象Object.assign Object.assign(obj1,obj2…) 说明:将obj1复制到obj2…重属性名的被后面的覆盖; 作用:对象的浅拷贝 转数组Object.keys Object.keys(obj) 说明: 将属性名转数组 Object.values(obj) 将属性值转数组 常用于判断是否有error,如果满足条件给对象添加属性值,最后判断Object.values(resultObj)后的length是否>

rainbow的博客 271

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1537

ES6中的 new Map() 对象

学习笔记666 6万+

软考备考:《系统规划与管理师教程》(第2版)第2章——数字ZG与数智化发展

🔴数字化转型的定义:数字化转型是建立在数字化转换、数字化升级基础上,进一步触及组织核心业务,以新建一种业务模式为目标的高层次转型。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 960

petalinux2022.2启动文件编译配置

petalinux2021之前的版本里,导入目录components/yocto/下的“environment-setup-aarch64-xilinx-linux” 和 “layers/core/oe-init-build-env”的环境,能使用Yocto的devtool工具。(加入下面内容,先petalinux-build下载完成后才能有源码)制作 BOOT.BIN 启动文件:petalinux-package --boot --fsbl --fpga --u-boot --force。

wangjie36的博客 1391

Map and Set(映射和集合)

JS的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。ES6 提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。

weixin_58139900的博客 284

SAP Event Mesh 简介

Get Started with Messaging for Decoupled Communication Step 1: What is the SAP Event Mesh service? SAP Event Mesh 是一种完全托管的服务,用于连接应用程序、服务和系统,以便它们可以通过消息和事件相互交互。 它通过引入中央消息代理取代了传统的点对点通信。 虽然点对点通信适用于在有限数量的发送方和接收方之间共享数据,但可扩展性很快就会成为一个问题。 SAP Event Mesh 解决了这个问题,并确保

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1243

JS的Map and Set (映射和集合)

Map and Set (映射和集合Map Map Map 是一个带键的数据项的集合,就好比Object,但是Map允许任何类型的键 new Map():创建新的map map.set(key,value):根据键存值 map.get(key):根据键返回值,若不存在对应的key 则返回undefined map.has(key):若有key返回true 否则返回false map.delete(key): 删除指定key的值 map.size: 返回当前元素个数 举个例子????: let map

Hy_0452的博客 338

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

集合和映射(Set And Map)

集合 Set   Set是一种新的数据结构,类似于数组,但是不能添加重复的元素,基于Set集合的这个特性,我们可以使用Set集合进行客户统计和词汇统计等,集合中常用的方法如下: public interface Set<E> { void add(E e); //添加元素e,不能添加重复元素 boolean contains(E e); //当前集合中是否包含元素e void remove(E e); //删除元素e int getSize(); //获取当前集

程序员波特 504

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

集合和映射(set and map)

集合 回忆上次实现的二分搜索树 不能放重复的元素 有序集合和无需集合 有序集合中的元素具有顺序性(基于搜索树的实现) 无需集合中的元素没有顺序性(基于hash表的实现) 多重集合 集合中的元素可以重复 映射 Map 存储(键值)数据对的数据结构(key,value) 根据key寻找value ...

待到山花烂漫时 318

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

集合和映射 Set and Map

1. 集合 Set     1.1 定义                 集合是具有某种相似特性的事物的全体。它的重要特点是其中的数据元素无序且不重复,这也就是判断是否使用该容器的依据。     1.2.1 利用二分搜索树实现集合         利用我之前的树的定义和实现中的bst.go函数来调用而实现的 package arr type Set struct{ root Roo...

土豆科技的博客 237

数组结构七:集合和映射(Set And Map)

数组结构七:集合和映射(Set And Map)

songzi1228的博客 388

javaScript基础--Map and Set(映射和集合)

new Set(iterable) 创建一个 set,如果提供了一个 iterable 对象(通常是数组),将会从数组里面复制值到 set 中。setName.has(value)判断value是否存在,有返回true,没有返回false,类似对象的hasOwn。set是一个特殊的类型集合,值的集合,没有键。setName.add(value) 添加一个值,返回set本身,所以也可以使用链式方式使用。set.size 返回元素个数(但是set只保存不重复的,所以这个值是去重后的值)

LoveSQ0625的博客 643

集合和映射(set and map)__JAVA版

集合 1.不支持添加重复元素 2.底层可以采用BST和LinkedList来实现 3.应用: 客户统计 ,词汇量统计 Set&lt;E&gt;接口 public interface Set&lt;E&gt; { void add(E e); void remove(E e); boolean contains(E e); int getSize(); b...

Tailor_Wu的博客 288

数组结构七:集合和映射(Set And Map,androidwifi开发框架

======== 称映射不是那么好理解,称为字典就更好理解一点。在Python中,map这种数据结构的名字就是dict(dictionary的缩写 字典)、 总结: 存储(键,值)数据对的数据结构(Key,Value) 根据Key,寻找Value 非常容易使用链表或者二分搜索树实现 3.1、Map.java public interface Map<K, V> { int getSize(); boolean isEmpty(); void add(K key, V

m0_66265031的博客 160

我理解的数据结构(六)—— 集合和映射(Set And Map)

我理解的数据结构(六)—— 集合和映射(Set And Map) 一、集合 1.典型应用场景 客户统计 词汇量统计 2.集合接口 public interface Set<E> { // 集合不存放相同元素 void add(E e); // 删除元素 void remove(E e); ...

weixin_33849942的博客 296

Map集合与Set集合

【前言】Map集合与Set集合都是专门用来进行搜索的容器或者数据结构(尤其适合动态查找,什么是动态查找呢,就是可能在查找时进行插入、删除的操作,如生活中的根据姓名查找考试成绩) 一、Map集合 1.官方文档: 首先值得注意的就是,Map并没有继承自Collection接口,而是独立的一块数据结构; Map是一个接口类,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复; Map接口下有两个普通子类,HashMap和TreeMap,其中,HashMap就是我们通常所

敲敲敲 1133

Java[集合] Map 和 Set

哈喽,大家好~ 我是保护小周ღ,本期为大家带来的是 Java Map 和 Set 集合详细介绍了两个集合的概念及其常用方法,感兴趣的朋友可以来学习一下。更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

保护小周ღ的博客 2245
上一篇: Symbol.iterator迭代器
下一篇: 词法环境(Lexical Environment)
fishmemory7sec
博客等级 码龄5年 1165粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值