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事件循环

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/606933.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源文档管理系统Paperless-ngx如何在Linux系统运行并发布至公网

文章目录 1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 Paperless-ngx是一个开源的文档管理系统,可以将物理文档转换成可搜索的在线档案,从而减少纸张的使用。它内置…

使用HashMap实现,对一个字符集进行哈夫曼编码

最终达到的效果: 调用一个类 class HuffmanCodin{.....} 使用类中的静态方法&#xff0c;获取哈夫曼编码&#xff1a; 事前准备——哈夫曼树的节点定义 class Node implements Comparable<Node> {int weight;//权重Node left;Node right;char ch;//关键字&#xff0c…

asp.net论坛指南系统

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 登陆可查看 浏览记录 TA的发布 TA的回复 TA的收藏 TA的点赞 管理员登陆可以查看举报管理 编辑管理 认证审核 帖子置顶申请审核 运行环境…

如何利用IPIDEA代理IP优化数据采集效率?

一、 前言二、 IPIDEA介绍三、体验步骤四、实战训练五、结语 一、 前言 在全球化与信息化交织的当代社会&#xff0c;数据已成为驱动商业智慧与技术革新的核心引擎。网络&#xff0c;作为信息汇聚与交流的枢纽&#xff0c;不仅是人们获取知识的窗口&#xff0c;更是商业活动与技…

FX110书籍推荐:如何快速成为一名专业股票投资人?

股票投资领域有一本神作《股票交易入门》&#xff0c;它是股票从业人员的入门必备书籍。 关于股票入门的书籍很多&#xff0c;但这本书涉及的知识面最全、实用性最强。从这本书里&#xff0c;我们可以领略到股票交易世界的跌宕起伏而又波澜壮阔的魅力。本书作者 本书的作者是美…

Navicat导入sql报错[Err] 1046 - No database selected

Navicat导入sql报错[Err] 1046 - No database selected ​ 今天系统重装了&#xff0c;就很完蛋。所有东西都重新下载安装。向Navicat导入sql的时候导入失败&#xff1a; 报错[Err] 1046 - No database selected。我很疑惑地又导了几次。当然又全都失败. 错误造成原因&#x…

项目风采展示【车酷-雷克萨斯2】

1&#xff1a;支持桌面展示 2&#xff1a;支持桌面时钟 3&#xff1a;支持桌面陀螺仪

怎么将文字做成二维码?文本活码在线的生成技巧

文本类型的活码该如何来制作呢&#xff1f;通过二维码来展示文字信息是现在很常用的一种方式&#xff0c;包括物品、建筑、人员等方面的信息&#xff0c;都可以用生成二维码后让其他人通过扫码了解自己需要的信息。那么文本活码的制作需要几步操作呢&#xff1f;下面就教大家使…

mysql等保测评2.0命令-三级

版本 Win默认安装位置 C:\Program Files\MySQL\MySQL Server 8.0\bin 版本&#xff1a;select version() from dual; 身份鉴别 a应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b; 1、SELEC…

OpenGL入门第二步:颜色、纹理设置(解析)

OpenGL入门第一步:创建窗口、重写虚函数-CSDN博客 1、设置颜色 添加QColor变量,如果需要颜色随时间变化,那就再添加一个定时器QElapsedTimer以及重写虚函数timerEvent。 initializeGL()函数设置片段着色器中颜色变量 如果需要设置时间别忘了开启计时器 timerEvent函数里写…

UE和three.js的区别

UE&#xff08;Unreal Engine&#xff09;和three.js都是用于创建3D图形的软件平台&#xff0c;但它们在功能、目标和应用场景方面存在一些差异。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 功能 UE 是一款功能全面的3D游戏引擎&…

03-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容 上一节《02-单片机商业项目编程&#xff0c;从零搭建低功耗系统设计-CSDN博客》引出了伪时间片的概念&#xff0c;这也是再低功耗系统设计中必须使用的程序设计逻辑&#xff0c;本文着重来讲解如何利用伪时间片来设计伪多任务&#xff0c;以及伪时间片多任务内核设…

力扣刷题第1天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…

私人健身教练预约管理小程序开发源码现成案例(小程序+APP+H5 源码部署)

一、私人健身教练预约管理系统-环境介绍 1.1 私人健身教练预约管理系统-运行环境 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 系统架构&#xff1a;TP 后端&#xff1a;SpringBoot 前端&#xff1a;Vue 2. 私人健身教练预约管理系统-系统介绍。 2.1私人健身教练预约管…

手机传输助手有哪些?如何快速互传文件?

手机已经成为我们生活和工作中不可或缺的一部分&#xff0c;而手机传输助手&#xff0c;作为一种帮助我们在不同设备之间快速、方便地共享文件的工具&#xff0c;其重要性不言而喻。无论是在工作中需要将文件从电脑传输到手机&#xff0c;还是在生活中想要与朋友分享美好的瞬间…

FFmpeg常用命令详解与实战指南

下载地址&#xff1a;Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件&#xff0c;然后使用FFmpeg内置的分析器来获取视频的各种信息&#xff0c;包括视频编解码器、音频编解码器、分辨…

2.外卖点餐系统(Java项目 springboot)

目录 0.系统的受众说明 1.系统功能设计 2.系统结构设计 3.数据库设计 3.1实体ER图 3.2数据表 4.系统实现 4.1用户功能模块 4.2管理员功能模块 4.3商家功能模块 4.4用户前台功能模块 4.5骑手功能模块 5.相关说明 新鲜运行起来的项目&#xff1a;如需要源码数据库…

封装一个可以最小化和展开的弹窗组件

gl-dialog 大概思路&#xff1a; 在弹窗组件内部引入gl-dialog-collapse&#xff0c;这个组件主要用于存储已经被最小化的弹窗&#xff08;基础数据&#xff09; 弹窗内部的数据如何在父组件拿到是通过作用域插槽来实现的 gl-dialog接收一个tempData这个数据会在内部被记录下来…

IDEA远程连接Docker服务

1.确保你的服务器已经安装docker docker安装步骤可查看&#xff1a;CentOS 9 (stream) 安装 Docker 2.安装完docker后开启远程连接 默认配置下&#xff0c;Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求&#xff0c;需要在配置文件中打开TCP监听…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…
最新文章