当前位置: 首页 > news >正文

JavaScript map对象/set对象详解

文章目录

  • 一、map对象
  • 二、map对象应用场景
    • 1. 数组元素转换
    • 2. 对象数组的属性提取或转换
    • 3. 数组元素的复杂转换
    • 4. 与其他数组方法结合使用
    • 5. 与异步操作结合(使用 Promise)
    • 6. 生成新的数据结构
    • 7. 数学和统计计算
  • 三、set对象
    • 1. 基本使用
    • 2. 特性
    • 3. 注意事项
    • 4. 与数组的区别
  • 四、set对象常见操作
    • 1. 创建 Set 对象
    • 2. 添加元素
    • 3. 检查元素是否存在
    • 4. 删除元素
    • 5. 获取 Set 的大小
    • 6. 遍历 Set
    • 7. 转换为数组
    • 8. 清除 Set
    • 9. 交集、并集、差集操作
    • 10. 使用 Set 去重
  • 五、热门文章

一、map对象

在JavaScript中,map 是一种常见的方法,主要用于数组(Array)对象。这个方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

map 方法的基本语法如下:

arr.map(function callback(currentValue[, index[, array]]) {// 返回元素的新值
}[, thisArg])
  • callback:生成新数组元素的函数,有三个参数:
    • currentValue(必需):数组中正在处理的当前元素。
    • index(可选):数组中正在处理的当前元素的索引。
    • array(可选):map 方法被调用的数组。
  • thisArg(可选):执行 callback 函数时 this 所指向的对象。

下面是一个使用 map 方法的简单示例:

const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(function(number) {return number * 2;
});console.log(doubled); // 输出:[2, 4, 6, 8, 10]

在这个例子中,我们有一个包含数字的数组 numbers。我们使用 map 方法遍历这个数组,并返回一个新数组 doubled,其中的每个元素都是原数组中对应元素的两倍。

你也可以使用箭头函数来简化代码:

const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(number => number * 2);console.log(doubled); // 输出:[2, 4, 6, 8, 10]

此外,map 方法不会改变原始数组,而是返回一个新数组。这是它与其他会修改原始数组的方法(如 forEachpoppush 等)之间的主要区别。

二、map对象应用场景

JavaScript 中的 map() 方法在数组操作中非常有用,它允许你遍历数组的每个元素,并对每个元素执行一个函数,然后将该函数的结果组成一个新的数组。以下是 map() 方法的一些常用场景:

1. 数组元素转换

当你需要将数组中的每个元素转换为另一种形式时,可以使用 map()。例如,你可能有一个数字数组,并希望将其转换为字符串数组,或者将每个元素乘以某个数。

const numbers = [1, 2, 3, 4, 5];
const strings = numbers.map(num => num.toString()); // ["1", "2", "3", "4", "5"]
const doubled = numbers.map(num => num * 2); // [2, 4, 6, 8, 10]

2. 对象数组的属性提取或转换

如果你有一个对象数组,并希望提取或转换每个对象的某个属性,map() 也能派上用场。

const users = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Charlie' }
];
const names = users.map(user => user.name); // ["Alice", "Bob", "Charlie"]

3. 数组元素的复杂转换

有时,你可能需要对数组中的每个元素进行复杂的转换,这可能需要多个步骤或依赖于其他数据。map() 可以很容易地处理这种情况。

const prices = [100, 200, 300];
const discountedPrices = prices.map(price => price * 0.9); // 打折后的价格

4. 与其他数组方法结合使用

map() 经常与其他数组方法(如 filter()reduce())结合使用,以执行更复杂的数组操作。

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const evenSquares = numbers.filter(num => num % 2 === 0) // 过滤出偶数.map(num => num * num); // 平方每个偶数
// [4, 16, 36, 64]

5. 与异步操作结合(使用 Promise)

虽然 map() 本身不直接支持异步操作,但你可以使用它结合 Promise 和 async/await 来处理异步数组操作。

async function fetchData(urls) {const responses = await Promise.all(urls.map(url => fetch(url)));const data = await Promise.all(responses.map(response => response.json()));return data;
}

6. 生成新的数据结构

map() 可以用于基于原始数组生成全新的数据结构,如对象或嵌套数组。

const numbers = [1, 2, 3];
const objects = numbers.map(num => ({ value: num, squared: num * num }));
// [{ value: 1, squared: 1 }, { value: 2, squared: 4 }, { value: 3, squared: 9 }]

7. 数学和统计计算

对于涉及数组元素数学运算的任务(如计算每个元素的平方、累加等),map() 可以提供一个简洁的解决方案。

三、set对象

在JavaScript中,Set 是一个内建的对象类型,它允许你存储唯一的值,无论是原始值或者是对象引用。每个值在Set对象中只会出现一次。它是ES6(ECMAScript 2015)中引入的一种新的数据结构。

1. 基本使用

你可以通过new Set()来创建一个空的Set对象,或者传递一个数组或其他可迭代对象来初始化它。

// 创建一个空的 Set
let mySet = new Set();// 创建一个包含初始值的 Set
let mySet = new Set([1, 2, 3, 4, 4]); // 注意:4 只会出现一次// 添加元素
mySet.add(5);// 检查元素是否存在
console.log(mySet.has(1)); // 输出:true
console.log(mySet.has(6)); // 输出:false// 获取 Set 的大小
console.log(mySet.size); // 输出:5// 删除元素
mySet.delete(3);
console.log(mySet.has(3)); // 输出:false// 遍历 Set
for (let item of mySet) {console.log(item); // 依次输出:1, 2, 4, 5(顺序可能与输入时不同)
}// 转换为数组
let myArray = Array.from(mySet);
// 或者使用扩展运算符 ...
let myArray = [...mySet];
console.log(myArray); // 输出:[1, 2, 4, 5](顺序可能与输入时不同)

2. 特性

  1. 唯一性Set中的元素是唯一的,重复添加同一个值不会有任何效果。
  2. 无序性Set中的元素没有特定的顺序。虽然插入时有顺序,但是当你遍历它时,顺序可能会根据具体的实现有所不同。
  3. 可迭代Set是可迭代的,所以你可以使用for...of循环来遍历它。

3. 注意事项

  • 当使用对象作为Set的元素时,由于对象的引用性质,即使两个对象的内容相同,但它们在内存中的位置不同,所以它们会被视为不同的元素。
  • 如果你想要比较对象的内容是否相同,而不是引用是否相同,你可能需要自行实现一个比较函数或者使用其他数据结构,如Map结合自定义的键来存储对象。

4. 与数组的区别

数组可以包含重复的元素,而Set不可以。此外,数组是有序的,但Set是无序的(尽管在插入时有一定的顺序,但在遍历时可能会变化)。这些特性使得Set在某些场景下(如去重、检查唯一性等)比数组更为方便和高效。

四、set对象常见操作

在JavaScript中,Set 对象是一种特殊的类型,它允许你存储唯一的值(无论是原始值还是对象引用)。以下是一些基本的操作 Set 对象的方法:

1. 创建 Set 对象

你可以使用 new Set() 来创建一个新的 Set 对象。

let mySet = new Set();

或者,你可以通过传递一个数组或其他可迭代对象来初始化 Set

let mySet = new Set([1, 2, 3, 4, 4]); // 4 只会出现一次

2. 添加元素

使用 add() 方法向 Set 中添加元素。

mySet.add(5);

3. 检查元素是否存在

使用 has() 方法来检查 Set 中是否包含某个元素。

console.log(mySet.has(1)); // 输出:true
console.log(mySet.has(6)); // 输出:false

4. 删除元素

使用 delete() 方法(注意:在Set中是delete而不是数组的splicepop等方法)从 Set 中删除元素。

mySet.delete(3);
console.log(mySet.has(3)); // 输出:false

5. 获取 Set 的大小

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

console.log(mySet.size); // 输出:4(假设已经删除了元素3)

6. 遍历 Set

由于 Set 对象是可迭代的,你可以使用 for...of 循环来遍历它。

for (let item of mySet) {console.log(item); // 依次输出 Set 中的元素
}

7. 转换为数组

你可以使用 Array.from() 方法或扩展运算符 ...Set 转换为数组。

let myArray = Array.from(mySet);
// 或者
let myArray = [...mySet];
console.log(myArray); // 输出:一个包含 Set 中所有元素的数组

8. 清除 Set

使用 clear() 方法来清除 Set 中的所有元素。

mySet.clear();
console.log(mySet.size); // 输出:0

9. 交集、并集、差集操作

虽然 Set 对象本身没有提供直接进行交集、并集、差集操作的方法,但你可以通过组合使用 Set 的方法来实现这些功能。例如,你可以使用 filter() 方法结合 has() 方法来实现差集操作。

10. 使用 Set 去重

由于 Set 只存储唯一的值,因此它经常被用来去除数组中的重复项。

let arrayWithDuplicates = [1, 2, 2, 3, 4, 4, 5];
let uniqueArray = [...new Set(arrayWithDuplicates)];
console.log(uniqueArray); // 输出:[1, 2, 3, 4, 5]

五、热门文章

【温故而知新】JavaScript数字精度丢失问题
【温故而知新】JavaScript的继承方式有那些
【温故而知新】JavaScript中内存泄露有那几种
【温故而知新】JavaScript函数式编程
【温故而知新】JavaScript的防抖与节流
【温故而知新】JavaScript事件循环

相关文章:

JavaScript map对象/set对象详解

文章目录 一、map对象二、map对象应用场景1. 数组元素转换2. 对象数组的属性提取或转换3. 数组元素的复杂转换4. 与其他数组方法结合使用5. 与异步操作结合(使用 Promise)6. 生成新的数据结构7. 数学和统计计算 三、set对象1. 基本使用2. 特性3. 注意事项…...

【kettle017】kettle访问DB2数据库并处理数据至execl文件(最近完善中)

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下DB2数据库(IBM公司开发的一套关系型数据库管理系统&#xf…...

Spring Cloud原理详解和作用特点

当涉及到构建和管理分布式系统的微服务架构时,Spring Cloud 是一个备受欢迎的选择。它提供了一套强大的工具和组件,使开发者能够轻松地构建、部署和管理微服务应用程序。本文将深入探讨 Spring Cloud 的原理和作用特点。 1. Spring Cloud 的原理 Sprin…...

Linux —— 进程间通信

目录 一、进程间通信的介绍二、管道三、匿名管道四、命名管道五、system V进程间通信 一、进程间通信的介绍 1.进程间通信的概念 进程通信(Interprocess communication),简称:IPC; 本来进程之间是相互独立的。但是…...

ASP.NET信息安全研究所设备管理系统的设计与实现

摘 要 以研究所的设备管理系统为背景,以研究所设备管理模式为研究对象,开发了设备管理系统。设备管理系统是设备管理与计算机技术相结合的产物,根据系统的功能需求分析与定义的数据模式,分析了应用程序的主要功能和系统实现的主…...

<网络安全>《81 微课堂<安全产品微简介(1)>》

1 简单的了解复杂的安全产品 产品简要防火墙网络区域边界上部署,主要作用是隔离阻断。安全审计一般包括网络日志的分析、网络流量的监控和用户行为的跟踪等。发现网络中的潜在问题和漏洞。入侵检测IDS实时监控和检测网络中的异常活动和入侵行为。入侵防御IPS防病毒…...

【6D位姿估计】FoundationPose 跑通demo 训练记录

前言 本文记录在FoundationPose中,跑通基于CAD模型为输入的demo,输出位姿信息,可视化结果。 然后分享NeRF物体重建部分的训练,以及RGBD图为输入的demo。 1、搭建环境 方案1:基于docker镜像(推荐&#xf…...

Python 中 “yield“ 的不同行为

在我们使用Python编译过程中,yield 关键字用于定义生成器函数,它的作用是将函数变成一个生成器,可以迭代产生值。yield 的行为在不同的情况下会有不同的效果和用途。 1、问题背景 在 Python 中,“yield” 是一种生成器&#xff0…...

迅睿CMS中实现关键词搜索高亮

在迅睿CMS系统中实现关键词搜索高亮是提升用户体验和搜索效果的重要手段。当用户搜索某个关键词时,将搜索结果中的关键词高亮显示,可以帮助用户更快速地定位到所需信息。 关键词高亮的实现 在迅睿CMS中,你可以使用内置的dr_keyword_highlig…...

晶振的精度与稳定性有什么关系?

晶振的精度和稳定性是电子设备中非常重要的参数,它们受到多种因素的影响,主要包括: 精度的影响因素: 温度变化:晶体的温度系数会使得频率随温度变化而变化,通常在0C到55C的工业标准温度范围内,…...

【C】137 只出现一次的数字

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 解法一 #include <stdio.h>int singleNumber(i…...

51单片机入门:DS1302时钟

51单片机内部含有晶振&#xff0c;可以实现定时/计数功能。但是其缺点有&#xff1a;精度往往不高、不能掉电使用等。 我们可以通过DS1302时钟芯片来解决以上的缺点。 DS1302时钟芯片 功能&#xff1a;DS1302是一种低功耗实时时钟芯片&#xff0c;内部有自动的计时功能&#x…...

Redis-5 分布式锁

一.为什么要使用分布式锁&#xff1f; 传统的互斥锁synchronized只能作用于同一台虚拟机上的线程&#xff0c;在使用服务器集群部署的情况下&#xff0c;互斥锁就会失效&#xff0c;因此要采用分布式锁来处理不同服务器上的线程访问同一资源的情况。 二.redis的分布式锁是如何…...

音转文工具,9.8k star! 【送源码】

我们经常会遇到将音频转为文字的情况&#xff0c;比如在开会时录音的会议纪要、上课时录下的老师讲课内容。虽然网上也有一些在线的工具可以将音频转为文字&#xff0c;但是考虑到数据安全和费用问题&#xff0c;使用起来也不是很方便。 今天了不起给大家介绍一款开源工具——…...

【首次发布】华为 OD 机试 C卷抽中题库清单(真题库),目前华为OD机考以C卷为主,特殊情况会发送D卷

本篇博客为大家整理华为 OD 考友反馈 C 卷抽中题&#xff0c;经过 1 个的考友复盘&#xff0c;目前已经收录 100 题目&#xff0c;预计在有 2 周可以收集完整。 所有题目&#xff0c;都有考友截图反馈&#xff0c;同时欢迎大家机考过后&#xff0c;提供橡皮擦真题&#xff0c;获…...

【进程等待】waitpid的参数pid | status的位图位操作WIFEXITEDWEXITSTATUS宏

目录 waitpid pid status status位图 status按位操作 输入型参数和输入型参数 宏WIFEXITED&WEXITSTATUS options&非阻塞等待 上篇进程等待我们介绍到怎样去进程等待。我们介绍了wait函数&阻塞等待。本篇我们将介绍waitpid函数的参数pid和status。 waitp…...

unity---常用API

1. Vector3&#xff1a;结构体由x、y、z这3个数值组成&#xff0c;表示一个向量 magnitude变量返回该向量的长度normalized变量返回 magnitude 为 1 时的该向量zero静态变量Vector3(0, 0, 0)one静态变量Vector3(1, 1, 1)forward静态变量Vector3(0, 0, 1)back静态变量Vector3(0…...

设计模式: 模板模式

目录 一&#xff0c;模板模式 二&#xff0c;特点 三&#xff0c;组成部分 四&#xff0c;实现步骤 五&#xff0c;案例 一&#xff0c;模板模式 模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它在超类中定义了一个算法的骨架&#…...

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…...

头文件相互包含 前向声明

当两个类需要相互访问对方的成员或方法时&#xff0c;通常意味着它们之间存在某种依赖关系。这种依赖关系可能源于类的设计或功能需求。以下是一个简单的例子&#xff0c;展示了当两个类需要相互访问对方成员或方法时&#xff0c;如何使用包含对方头文件的方式来解决循环包含的…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...