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

JavaScript 中级进阶技巧之map函数

作为一名初级 JavaScript 开发者,你可能已经熟悉了基础语法、变量和简单的循环。但要从初级迈向中级,掌握一些高效、优雅的编码技巧是关键。其中,map 函数是中级开发者常用的工具,它不仅能简化代码,还能提升代码的可读性和性能。本文将以 map 函数为核心,结合 filterreduce 等高阶函数,以及其他实用技巧(如解构赋值、短路运算),带你探索中级 JavaScript 开发者的思维方式。通过实战案例和代码优化建议,帮助你快速进阶,写出更专业的前端代码。
关于作者:我是小贺,乐于分享各种前端知识,同时欢迎大家关注我的个人博客以及微信公众号[小贺前端笔记]

无论是开发动态网页、处理 API 数据,还是优化用户交互,掌握这些技巧都能让你的代码更简洁、更高效。让我们开始这场 JavaScript 进阶之旅!

1. 理解 map 函数:从循环到函数式编程

1.1 什么是 map 函数?

map 是一个数组方法,用于遍历数组并根据提供的回调函数生成一个新数组。它的核心优势是不改变原数组,且代码简洁,适合函数式编程。

语法

array.map(callback(element[, index[, array]])[, thisArg])
  • callback:对每个元素执行的函数,接收 element(当前元素)、index(索引)、array(原数组)作为参数。
  • thisArg:可选,指定回调函数中的 this

简单示例

const numbers = [1, 2, 3, 4];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8]
console.log(numbers); // [1, 2, 3, 4](原数组未变)

1.2 为什么用 map 而不是 for 循环?

初级开发者常使用 for 循环遍历数组,但 map 有以下优势:

  • 简洁性:一行代码完成遍历和转换。
  • 不可变性:不修改原数组,降低副作用。
  • 链式调用:可与其他数组方法(如 filterreduce)组合。

对比示例

// 使用 for 循环
const numbers = [1, 2, 3, 4];
const doubled = [];
for (let i = 0; i < numbers.length; i++) {doubled.push(numbers[i] * 2);
}// 使用 map
const doubledMap = numbers.map(num => num * 2);

map 的代码更简洁,且逻辑清晰,适合现代 JavaScript 开发。

1.3 实战应用:格式化 API 数据

假设你从 API 获取了一组用户数据,需要将用户名转换为大写并添加前缀。map 是理想选择:

const users = [{ name: 'alice', age: 25 },{ name: 'bob', age: 30 },{ name: 'charlie', age: 35 }
];const formattedUsers = users.map(user => ({...user,name: `VIP_${user.name.toUpperCase()}`
}));console.log(formattedUsers);
/*
[{ name: 'VIP_ALICE', age: 25 },{ name: 'VIP_BOB', age: 30 },{ name: 'VIP_CHARLIE', age: 35 }
]
*/

技巧:结合解构赋值和对象展开运算符(...),可以优雅地操作复杂数据结构。

2. 扩展视野:filterreduce 的妙用

map 常与其他高阶函数配合使用,下面介绍 filterreduce,它们同样是中级开发者的必备工具。

2.1 filter:筛选符合条件的元素

filter 用于根据条件返回一个新数组,包含所有满足条件的元素。

示例:筛选年龄大于 30 的用户:

const users = [{ name: 'alice', age: 25 },{ name: 'bob', age: 30 },{ name: 'charlie', age: 35 }
];const adults = users.filter(user => user.age > 30);
console.log(adults); // [{ name: 'charlie', age: 35 }]

map 结合:先筛选,再转换:

const vipAdults = users.filter(user => user.age > 30).map(user => `VIP_${user.name.toUpperCase()}`);
console.log(vipAdults); // ['VIP_CHARLIE']

2.2 reduce:从数组到单一值

reduce 用于将数组“归约”为一个值(如求和、合并对象)。

示例:计算所有用户的年龄总和:

const totalAge = users.reduce((sum, user) => sum + user.age, 0);
console.log(totalAge); // 90

进阶应用:将用户数组转为对象:

const userMap = users.reduce((acc, user) => ({...acc,[user.name]: user.age
}), {});
console.log(userMap); // { alice: 25, bob: 30, charlie: 35 }

技巧reduce 功能强大,但逻辑复杂时注意代码可读性,必要时拆分成多步。

3. 其他实用技巧:让代码更优雅

除了高阶函数,中级开发者还常用以下技巧提升代码质量。

3.1 解构赋值:简化变量提取

解构赋值让代码更简洁,尤其在处理对象或数组时。

示例

const user = { name: 'alice', age: 25, city: 'Beijing' };
const { name, age } = user;
console.log(name, age); // alice 25// 数组解构
const colors = ['red', 'green', 'blue'];
const [first, second] = colors;
console.log(first, second); // red green

实战:结合 map 处理嵌套数据:

const users = [{ info: { name: 'alice', age: 25 } },{ info: { name: 'bob', age: 30 } }
];const names = users.map(({ info: { name } }) => name);
console.log(names); // ['alice', 'bob']

3.2 短路运算与可选链:优雅处理条件

  • 短路运算&&||):简化条件判断。

    const isActive = true;
    const message = isActive && 'User is active';
    console.log(message); // 'User is active'
    
  • 可选链?.):安全访问嵌套属性。

    const user = { profile: { name: 'alice' }};
    const name = user?.profile?.name ?? 'Unknown';
    console.log(name); // 'alice'
    

4. 实战案例:动态列表渲染与数据处理

让我们通过一个前端案例,综合运用以上技巧,展示如何处理动态数据并渲染到页面。

4.1 场景描述

假设你正在开发一个任务管理应用,API 返回以下任务数据:

const tasks = [{ id: 1, title: 'Learn JavaScript', completed: false },{ id: 2, title: 'Write Blog', completed: true },{ id: 3, title: 'Review Code', completed: false }
];

需求:

  • 显示所有未完成任务的标题(大写)。
  • 计算已完成任务的数量。
  • 渲染任务列表到页面。

4.2 实现代码

// 数据处理
const pendingTasks = tasks.filter(task => !task.completed).map(task => task.title.toUpperCase());const completedCount = tasks.reduce((count, task) => count + (task.completed ? 1 : 0), 0);console.log('Pending Tasks:', pendingTasks); // ['LEARN JAVASCRIPT', 'REVIEW CODE']
console.log('Completed Count:', completedCount); // 1// 渲染到页面
const taskList = document.getElementById('taskList');
tasks.forEach(({ id, title, completed }) => {const li = document.createElement('li');li.textContent = `${title} ${completed ? '(Done)' : ''}`;li.style.color = completed ? 'green' : 'red';taskList.appendChild(li);
});

HTML 结构

<ul id="taskList"></ul>

4.3 优化建议

  • 性能:对于大数据量,使用虚拟列表或分页加载。
  • 可读性:将数据处理和渲染逻辑分开,方便维护。
  • 复用性:将 mapfilter 逻辑封装为函数,增强代码复用。

5. 总结

mapfilterreduce,再到解构赋值和短路运算,这些 JavaScript 技巧是中级开发者的核心工具。它们不仅让代码更简洁,还能提升性能和可维护性。通过本文的实战案例,你可以看到这些技巧如何在实际项目中发挥作用。

欢迎在评论区分享你的 JavaScript 技巧,或提问你的疑惑!让我们一起成长为更优秀的前端开发者!

相关文章:

JavaScript 中级进阶技巧之map函数

作为一名初级 JavaScript 开发者&#xff0c;你可能已经熟悉了基础语法、变量和简单的循环。但要从初级迈向中级&#xff0c;掌握一些高效、优雅的编码技巧是关键。其中&#xff0c;map 函数是中级开发者常用的工具&#xff0c;它不仅能简化代码&#xff0c;还能提升代码的可读…...

PROFIBUS DP转ModbusTCP网关模块于污水处理系统的成功应用案例解读​

在当今的工业生产领域&#xff0c;众多企业在生产过程中会产生大量工业废水。若这些废水未经处理直接排放&#xff0c;将会引发严重的工业污染问题。因此&#xff0c;借助科技手段对污水进行有效处理显得尤为重要。在一个污水处理系统中&#xff0c;往往包含来自不同厂家、不同…...

Java实现桶排序算法

1. 桶排序原理图解 桶排序是一种基于分桶思想的非比较排序算法&#xff0c;适用于数据分布较为均匀的场景。其核心思想是将数据分散到有限数量的“桶”中&#xff0c;每个桶再分别进行排序&#xff08;通常使用插入排序或其他简单的排序算法&#xff09;。以下是桶排序的步骤&a…...

《Effective Python》第2章 字符串和切片操作——深入理解 Python 中 __repr__ 与 __str__

引言 本文基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 12: Understand the Difference Between repr and str When Printing Objects 后的总结与延伸。在 Python 中&#xff0c;__repr__ 和 __str__ 是两个与对象打印密切相关的魔术方法&am…...

电脑开机提示按f1原因分析及解决方法(6种解决方法)

经常有网友问到一个问题,我电脑开机后提示按f1怎么解决?不管理是台式电脑,还是笔记本,都有可能会遇到开机需要按F1,才能进入系统的问题,引起这个问题的原因比较多,今天小编在这里给大家列举了比较常见的几种电脑开机提示按f1的解决方法。 电脑开机提示按f1原因分析及解决…...

复现:DemoGen 用于数据高效视觉运动策略学习的 合成演示生成 (RSS) 2025

https://github.com/TEA-Lab/DemoGen?tabreadme-ov-file 复现步骤很简单&#xff0c;按照readme配置好conda环境即可运行。 运行&#xff1a; cd demo_generation bash run_gen_demo.sh 等待生成&#xff1a; 查看data文件夹...

Nginx核心功能及同类产品对比

Nginx 作为一款高性能的 Web 服务器和反向代理工具&#xff0c;凭借其独特的架构设计和丰富的功能&#xff0c;成为互联网基础设施中不可或缺的组件。以下是其核心功能及与同类产品&#xff08;如 HAProxy、LVS&#xff09;的对比优势&#xff1a; 一、Nginx 核心功能 高性能架…...

本地部署firecrawl的两种方式,自托管和源码部署

网上资料很多 AI爬虫黑科技 firecrawl本地部署-CSDN博客 源码部署 前提条件本地安装py&#xff0c;node.js环境,嫌弃麻烦直接使用第二种 使用git或下载压缩包 git clone https://github.com/mendableai/firecrawl.git 设置环境参数 cd /firecrawl/apps/api 复制环境参数 …...

2023年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 一、单选题(共25题&#xff0c;共50分) 1. 运行以下程序&#xff0c;输出的结果是&#xff1f;&#xff08; &#xff09; class A(): …...

spark:map 和 flatMap 的区别(Scala)

场景设定 假设有一个包含句子的 RDD&#xff1a; scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目标是&#xff1a;将每个句子拆分成单词。 1. 用 map 的效果 代码示例 scala val resultMap rdd.map(sentence > sentence…...

Spring @Lazy注解详解

文章目录 Lazy注解主要作用工作原理使用方法注意事项总结 Lazy注解主要作用 首先&#xff0c;让我们看看Lazy注解的源码&#xff0c;截图如下&#xff1a; 源码注释翻译如下 通过源码&#xff0c;我们可以看到&#xff1a;Lazy注解是一个标记注解&#xff0c;用于标记 bean会…...

关于推送后台的webapi demo

文章目录 目录 系列文章目录 文章目录 前言 一、如何实现推送的思考 二、使用步骤 1.引入库 2.连接方法 3. 发送数据 4.结束时发的消息 5.相关的类 总结 前言 手机app一般都有接收消息推送的功能&#xff0c;比如美团app 点的外卖订单推送&#xff0c;那么对于后台如何将消息推…...

中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果

品牌&#xff0c;作为企业不可或缺的隐形财富&#xff0c;在当今竞争激烈的市场环境中&#xff0c;其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品&#xff0c;激光院激光公司于2020年3月7日正式注册“风采”商标&#xff0c;创建拥有自主知识产权…...

GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现

SUSE安全团队全面审计发现&#xff0c;广泛使用的终端复用工具GNU Screen存在一系列严重漏洞&#xff0c;包括可导致本地提权至root权限的缺陷。这些问题同时影响最新的Screen 5.0.0版本和更普遍部署的Screen 4.9.x版本&#xff0c;具体影响范围取决于发行版配置。 尽管GNU Sc…...

05.three官方示例+编辑器+AI快速学习three.js webgl - animation - skinning - ik

本实例主要讲解内容 这个Three.js示例展示了**反向运动学(Inverse Kinematics, IK)**在3D角色动画中的应用。通过加载一个角色模型&#xff0c;演示了如何使用IK技术实现自然的肢体运动控制&#xff0c;如手部抓取物体的动作。 核心技术包括&#xff1a; CCD反向运动学求解器…...

计算机视觉与深度学习 | 激光雷达 vs. RTK+摄像头:谁是智能割草机器人的最优选择?

激光雷达 vs. RTK+摄像头 一、技术原理与核心优势对比二、实际应用中的性能差异三、行业趋势与创新方向四、场景化选择建议五、未来展望激光雷达与RTK+摄像头是智能割草机器人领域两种主流技术路线,各有其适用场景与优劣势。结合行业最新动态与技术演进,以下从多个维度对比分…...

第29节:现代CNN架构-Inception系列模型

引言 Inception系列模型是卷积神经网络(CNN)发展历程中的重要里程碑,由Google研究人员提出并不断演进。这一系列模型通过创新的架构设计,在保持计算效率的同时显著提升了图像识别任务的性能。从最初的Inception v1到最新的Inception-ResNet,每一代Inception模型都引入了突破…...

【深度学习】将本地工程上传到Colab运行的方法

1、将本地工程&#xff08;压缩包&#xff09;上传到一个新的colab窗口&#xff1a;如下图中的 2.zip&#xff0c;如果工程中有数据集&#xff0c;可以删除掉。 2、解压压缩包。 !unzip /content/2.zip -d /content/2 如果解压出了不必要的文件夹可以递归删除&#xff1a; #…...

RabbitMQ 中的六大工作模式介绍与使用

文章目录 简单队列&#xff08;Simple Queue&#xff09;模式配置类定义消费者定义发送消息测试消费 工作队列&#xff08;Work Queues&#xff09;模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅&#xff08;Publish/Subscribe&#xff09;模式配置类定义消…...

Android HttpAPI通信问题(已解决)

使用ClearTextTraffic是Android中一项重要的网络设置,它控制了应用程序是否允许在不使用HTTPS加密的情况下访问网络。在默认情况下,usescleartexttraffic的值为true,这意味着应用程序可以通过普通的HTTP协议进行网络通信。然而,这样的设置可能会引发一些安全问题,本文将对…...

【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

SpringMVC的数据响应方式 页面跳转 直接返回字符串通过ModelAndView对象返回 回写数据 直接返回字符串返回对象或集合 页面跳转&#xff1a; 返回字符串方式 直接返回字符串&#xff1a;此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转 RequestMapping("/con&…...

docker安装mysql8, 字符集,SQL大小写规范,sql_mode

一、Docker安装MySQL 使用Docker安装MySQL,命令如下 docker run -d \-p 3306:3306 \-v mysql_conf:/etc/mysql/conf.d \-v mysql_data:/var/lib/mysql \--name mysql \--restartalways \--privileged \-e MYSQL_ROOT_PASSWORD1234 \mysql:8.0.30参数解释 &#x1f433; dock…...

FastMCP v2:构建MCP服务器和客户端的Python利器

FastMCP v2&#xff1a;构建MCP服务器和客户端的Python利器 引言 在人工智能与大语言模型&#xff08;LLMs&#xff09;的应用场景中&#xff0c;如何高效地构建服务器和客户端以实现数据交互与功能调用是关键问题。Model Context Protocol (MCP) 为此提供了一种标准&#xf…...

一个WordPress连续登录失败的问题排查

文章目录 1. 问题背景2. 解决方案搜索3. 问题定位4. 排查过程5. 清理空间6. 处理结果7. 后续优化 1. 问题背景 登录请求URL: Request URL: https://www.xxxxxx.com/wp-login.php 返回的响应头信息是: location: https://www.xxxxxx.com/wp-admin/ 证明登录成功。 接下来浏览器…...

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析

SSM整合的基础jar包 需要创建的层级&#xff1a; controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#x…...

Go语言超时控制方案全解析:基于goroutine的优雅实现

一、引言 在构建高可靠的后端服务时&#xff0c;超时控制就像是守护系统稳定性的"安全阀"&#xff0c;它确保当某些操作无法在预期时间内完成时&#xff0c;系统能够及时止损并释放资源。想象一下&#xff0c;如果没有超时控制&#xff0c;一个简单的数据库查询卡住…...

spark运行架构及核心组件介绍

目录 1. Spark 的运行架构1.1 Driver1.2 Executor1.3 Cluster Manager1.4 工作流程 2. Spark 的核心组件2.1 Spark Core2.2 Spark SQL2.3 Spark Streaming2.4 MLlib2.5 GraphX 3. Spark 架构图4. Spark 的优势4.1 高性能4.2 易用性4.3 扩展性4.4 容错性 5. 总结 1. Spark 的运行…...

idea中编写spark程序

### 在 IntelliJ IDEA 中配置和编写 Spark 程序 要在 IntelliJ IDEA 中高效地开发 Spark 程序&#xff0c;需要完成一系列必要的环境配置以及项目搭建工作。以下是详细的说明。 --- #### 1. 安装与配置 IntelliJ IDEA 为了确保 IDE 可以支持 Scala 开发&#xff0c;首先需要…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(21):复习

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;21&#xff09;&#xff1a;复习 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;じょうけん 条件形&#xff11;、復習 &#xff08;&#x…...

MYSQL数据库集群高可用和数据监控平台

项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP&#xff1a;192.168.12.200 cpu:1颗2核 内 存&#xff1a;2GB HDD&#xff1a;20GB 网 络&#xff1a;NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…...