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

JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)

目录

JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)

一、什么时候该使用Array.map(),与forEach()的区别是什么?

1、什么时候该用Array.map()

2、Array.map()与Array.forEach()的区别

二、Array.map()的使用与技巧

1、基本语法

2、返回值

3、使用技巧

三、Array.map()的应用领域与实际案例

1、数据转换与应用函数

2、创建派生数组

3、链式调用

4、异步数据流处理

5、复杂API请求梳理

6、提供DOM操作

7、用来搜索和过滤

四、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)

一、什么时候该使用Array.map(),与forEach()的区别是什么?

1、什么时候该用Array.map()

        一般满足下列三种情况之一就可以使用Array.map()了:

  • 需要返回一个新数组,新数组的长度与原数组相同
  • 需要进行链式调用,方便进行多步数据转换。
  • 需要修改数组且不修改原数组内容

2、Array.map()与Array.forEach()的区别

        最大的区别就是Array.map()有返回值,Array.forEach()没有返回值。以上三种情况也都是基于Array.map()有返回值所以才适用的。

二、Array.map()的使用与技巧

1、基本语法

array.map(callback(currentValue, index, array), thisArg)

        callback:一个函数,用于处理每个元素,并返回处理后的值。

  • currentValue:正在处理的当前元素。
  • index(可选):正在处理的当前元素的索引。
  • array(可选):调用 map() 的数组。

        thisArg(可选):执行 callback 函数时,用作 this 的值。

2、返回值

        返回一个新数组,结果为原始数组元素依次调用 callback 后的值(往往为一个新的数组)。

3、使用技巧

        array.map()创建一个新数组,其结果是该数组中的每个元素(调用一个提供的函数)调用一个提供的函数后的返回值。这个方法对原数组不进行任何修改。

        应用场景:数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等。其中应用函数常作为map操作中的其中一步,更多指一种封装和复用的思想而不是一种具体的需求。

三、Array.map()的应用领域与实际案例

1、数据转换与应用函数

        假设我们有一个电子商务网站的订单数组,每个订单是一个对象,包含 id、date、items 和 shipping。每个 items 是一个对象数组,包含 name、price 和 quantity。

        我们的目标是创建一个新的数组,其中每个元素是一个对象,包含订单的 id、订单总金额(所有商品价格和数量的总和)、订单日期以及基于总金额计算的税费(税费计算函数为 calculateTax(totalAmount),其中如果总金额小于1000,则税费为总金额的10%,否则为100)。

// 创建一个新的数组,其中每个元素是一个对象,包含订单的 id、订单总金额、订单日期以及基于总金额计算的税费
// 其中如果总金额小于1000,则税费为总金额的10%,否则为100// 示例订单数组
const orders = [{ id: 1, date: '2023-04-01', items: [{ name: 'Item1', price: 100, quantity: 2 }], shipping: 50 },{ id: 2, date: '2023-04-02', items: [{ name: 'Item2', price: 200, quantity: 1 }], shipping: 30 },// ... 更多订单
];// 税费计算函数
function calculateTax(totalAmount) {return totalAmount < 1000 ? totalAmount * 0.1 : 100;
}// 创建新数组,包含每个订单的id, 总金额, 订单日期和税费
const orderDetails = orders.map(order => {const totalAmount = order.items.reduce((sum, item) => sum + item.price * item.quantity, 0);const tax = calculateTax(totalAmount);return {id: order.id,totalAmount: totalAmount + order.shipping + tax, // 包括运费和税费的最终总金额date: order.date,tax: tax};
});console.log(orderDetails);// 输出:
[{id: 1,totalAmount: 300, // 100 * 2 (items) + 50 (shipping) + 20 (tax)date: '2023-04-01',tax: 20},{id: 2,totalAmount: 330, // 200 * 1 (item) + 30 (shipping) + 30 (tax)date: '2023-04-02',tax: 30},// ... 更多订单详情
]

2、创建派生数组

        要创建派生数组,相比于直接通过for循环来“以旧换新”,array.map()比for、foreach还有非常不常用的while、do...while高级,代码清晰,可读性强,代码就看起来很优雅,如果都是嵌套循环和嵌套回调,看起来就是一团乱麻,可读性差,很不优雅。

        举个例子:有一个员工信息的数组,每个员工对象包含 name、age 和 salary。我们想要创建一个新的数组,其中只包含年龄超过30岁的员工的姓名和工资。

// 有一个员工信息的数组,每个员工对象包含 name、age 和 salary。我们想要创建一个新的数组,其中只包含年龄超过30岁的员工的姓名和工资。const employees = [{ name: 'Alice', age: 25, salary: 70000 },{ name: 'Bob', age: 32, salary: 80000 },{ name: 'Charlie', age: 35, salary: 90000 },{ name: 'David', age: 22, salary: 60000 }
];const olderEmployees = employees.filter(employee => employee.age > 30) // 筛选年龄超过30岁的员工.map(employee => ({name: employee.name,salary: employee.salary})); // 创建新数组,只包含姓名和工资console.log(olderEmployees);// 输出:
[{ name: 'Bob', salary: 80000 },{ name: 'Charlie', salary: 90000 }
]

3、链式调用

        有一个用户信息的数组,每个用户对象包含 id、name 和 isActive。我们想要获取所有活跃用户的姓名,并按照字母顺序排序。

//有一个用户信息的数组,每个用户对象包含 id、name 和 isActive。我们想要获取所有活跃用户的姓名,并按照字母顺序排序const users = [{ id: 1, name: 'Alice', isActive: true },{ id: 2, name: 'Bob', isActive: false },{ id: 3, name: 'Charlie', isActive: true },{ id: 4, name: 'David', isActive: true }
];const activeUserNames = users.filter(user => user.isActive) // 筛选活跃用户.map(user => user.name) // 获取用户名.sort(); // 按照字母顺序排序console.log(activeUserNames);// 输出:
// ['Alice', 'Charlie', 'David']

4、异步数据流处理

        有一个用户列表,每个用户都有一个异步函数 fetchUserData 来获取用户的详细信息。我们想要获取所有用户的详细信息,并对结果进行处理。

// 有一个用户列表,每个用户都有一个异步函数 fetchUserData 来获取用户的详细信息。我们想要获取所有用户的详细信息,并对结果进行处理。const users = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },// ... 更多用户
];// 模拟异步获取用户详细信息的函数
const fetchUserData = userId => new Promise(resolve => setTimeout(() => resolve(`Data for user ${userId}`), 1000));// 使用 map() 和 Promise.all() 处理异步数据流
const fetchAllUserData = users.map(user =>fetchUserData(user.id).then(data => ({ ...user, details: data }))
);Promise.all(fetchAllUserData).then(usersWithData => {console.log(usersWithData); // 输出处理后包含每个用户详细信息的数组
});

5、复杂API请求梳理

        有时候需要从不同的API端点获取数据,并将这些数据汇总到一个数组中。

// 需要从不同的API端点获取数据,并将这些数据汇总到一个数组中。const apiEndpoints = ['https://api.example.com/data1','https://api.example.com/data2',// ... 更多API端点
];// 模拟异步API请求
const fetchDataFromApi = url => new Promise(resolve => setTimeout(() => resolve(`Data from ${url}`), 500));// 使用 map() 来对每个API端点发起请求
const fetchAllData = apiEndpoints.map(endpoint =>fetchDataFromApi(endpoint)
);Promise.all(fetchAllData).then(allData => {console.log(allData); // 输出包含所有API请求结果的数组
});

6、提供DOM操作

        假设我们有一个用户列表,我们想要为每个用户创建一个列表项并将其添加到页面上的一个列表中。

// 假设我们有一个用户列表,我们想要为每个用户创建一个列表项并将其添加到页面上的一个列表中。const users = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },// ... 更多用户
];// 选择页面上的列表元素
const userList = document.getElementById('user-list');// 使用 map() 生成每个用户的列表项
const listItems = users.map(user => {const li = document.createElement('li');li.textContent = `User ${user.name}`;return li;
});// 将所有列表项添加到列表中
listItems.forEach(item => userList.appendChild(item));

7、用来搜索和过滤

        假设我们有一个商品列表,我们想要根据用户的搜索输入来过滤商品。

// 假设我们有一个商品列表,我们想要根据用户的搜索输入来过滤商品。const products = [{ id: 1, name: 'Apple', category: 'Fruits' },{ id: 2, name: 'Banana', category: 'Fruits' },// ... 更多商品
];// 用户输入的搜索关键词
const searchQuery = 'Apple';// 使用 map() 和 filter() 进行搜索和过滤
const filteredProducts = products.filter(product => product.name.includes(searchQuery)).map(product => ({id: product.id,name: product.name,// 其他需要展示的信息}));console.log(filteredProducts); // 输出匹配搜索关键词的商品列表

四、总结

        array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。

        W3school传送门(我的博客更详细):JavaScript Array map() 方法

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能

        通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

        在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

        干货含源码!如何用Java后端操作Docker(命令行篇)

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=59ob9q3wxhx

相关文章:

JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)

目录 JavaScript中通过array.map(&#xff09;实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等&#xff0c;array.map&#xff08;&#xff09;的使用详解&#xff08;附实际应用代码&#xff09; 一、什么时候该使用Array.map()&#xff0…...

去除Mysql表中的空格、回车、换行符和特殊字符

系列文章目录 文章目录 系列文章目录前言一、示例1.sql层面2.java层面 前言 一、示例 1.sql层面 参考 ## 例子1 ## CHAR(10) 表示换行符 ## CHAR(13) 表示回车UPDATE 表名 SET 列名 REPLACE(REPLACE(列名, CHAR(10), ), CHAR(13), )## 例子2 ## 删除字段中的空格、换行符、…...

P9242 [蓝桥杯 2023 省 B] 接龙数列

这道题说要求最少删多少个使剩下的序列是接龙序列&#xff0c;这个问题可以转换为序列中最长的接龙序列是多少&#xff0c;然后用总长度减去最长接龙序列的长度就可以了&#xff0c;在第一个暴力版本的代码中我用了两个for循环求出了所有的接龙序列的长度&#xff0c;但是会超时…...

macos下 ragflow二次开发环境搭建

参考官网链接 https://ragflow.io/docs/dev/launch_ragflow_from_source虚拟环境 git clone https://github.com/infiniflow/ragflow.git cd ragflow/ # if not pipx, please install it at first pip3 install pipxpipx install uv uv sync --python 3.10 --all-extras 安装 …...

SQL优化技术分享:从 321 秒到 0.2 秒的性能飞跃 —— 基于 PawSQL 的 TPCH 查询优化实战

在数据库性能优化领域&#xff0c;TPC-H 测试集是一个经典的基准测试工具&#xff0c;常用于评估数据库系统的查询性能。本文将基于 TPCH 测试集中的第 20个查询&#xff0c;结合 PawSQL 自动化优化工具&#xff0c;详细分析如何通过 SQL 重写和索引设计&#xff0c;将查询性能…...

密码学基础——DES算法

前面的密码学基础——密码学文章中介绍了密码学相关的概念&#xff0c;其中简要地对称密码体制(也叫单钥密码体制、秘密密钥体制&#xff09;进行了解释&#xff0c;我们可以知道单钥体制的加密密钥和解密密钥相同&#xff0c;单钥密码分为流密码和分组密码。 流密码&#xff0…...

在 Linux 终端中轻松设置 Chromium 的 User-Agent:模拟手机模式与自定义浏览体验

在 Linux 系统中&#xff0c;通过终端灵活控制 Chromium 的行为可以大幅提升工作效率。本文将详细介绍如何通过命令行参数和环境变量自定义 Chromium 的 User-Agent&#xff0c;并结合手机模式模拟&#xff0c;实现更灵活的浏览体验。 为什么需要自定义 User-Agent&#xff1f;…...

ChatGPT 4:引领 AI 创作新时代

文章目录 前言一、ChatGPT 4 的技术革新二、AI 文案创作&#xff1a;精准生成与个性化定制三、AI 绘画艺术&#xff1a;从文字到图像的神奇转化四、AI 视频制作&#xff1a;自动化剪辑与创意实现五、知识库与 ChatGPT 4 的深度融合六、全新的变革和机遇七、相关书籍推荐《ChatG…...

http页面的加载过程

HTTP/2 核心概念 1.1 流&#xff08;Stream&#xff09; • 定义&#xff1a;HTTP/2 连接中的逻辑通道&#xff0c;用于传输数据&#xff0c;每个流有唯一标识符&#xff08;Stream ID&#xff09;。 • 特点&#xff1a; ◦ 支持多路复用&#xff08;多个流并行传输&#…...

MySQL【8.0.41版】安装详细教程--无需手动配置环境

一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统&#xff0c;由瑞典公司 MySQL AB 开发&#xff0c;现属于 Oracle 旗下。它基于 SQL&#xff08;结构化查询语言&#xff09;进行数据管理&#xff0c;支持多用户、多线程操作&#xff0c;广泛应用于 Web 应用、…...

鸿蒙ArkTS实战:从零打造智能表达式计算器(附状态管理+路由传参核心实现)

还在为组件状态混乱、页面跳转丢参数而头疼&#xff1f; 这篇博客将揭秘如何用鸿蒙ArkTS打造一个漂亮美观的智能计算器&#xff1a; ✅ 输入完整表达式&#xff0c;秒出结果——字符串切割简单计算 ✅ 状态管理黑科技——Provide/Consume 实现跨组件实时响应 ✅ 路由传参实战—…...

【58】编程技巧:单片机编程命名规范

【58】编程技巧&#xff1a;单片机编程命名规范 引言 在大型嵌入式项目开发中&#xff0c;变量和常量的命名混乱会导致代码难以维护。本文系统阐述变量、常量、指针、结构体等命名规范&#xff0c;通过统一规则提升代码可读性与协作效率。目标是帮助开发者建立清晰的命名习惯&…...

Windows 部署项目 apache + mod_wsgi,nginx + waitress

文章目录 1、apache mod_wsgi&#xff0c;nginx waitress两种部署方式的区别2、以nginx waitress为例 有些项目必须部署在windows上&#xff0c;有IIS wfastcgi、apache mod_wsgi&#xff0c;nginx waitress部署方式 1、apache mod_wsgi&#xff0c;nginx waitress两种…...

车辆视频检测器linux版对于密码中包含敏感字符的处理方法

由于密码中含有敏感字符&#xff0c;导致前端页面异常&#xff0c;图标变灰&#xff0c;坐标拾取打不开图像等&#xff0c;主要原因是&#xff1a;密码比较前后不一致&#xff0c;左边是Abc_110&#xff0c;右边是&#xff1a;Abc_110%2B&#xff0c;对于此问题&#xff0c;特别…...

Java服务端开发基石:深入理解Spring IoC与依赖注入 (DI)

今天&#xff0c;我们从现代Java开发&#xff0c;尤其是企业级应用中&#xff0c;几乎无处不在的Spring框架的核心概念开始&#xff1a;控制反转&#xff08;Inversion of Control, IoC&#xff09; 与 依赖注入&#xff08;Dependency Injection, DI&#xff09;。理解它们&am…...

【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例

今天田辛老师和小伙伴探讨了一个有趣的多义词问题&#xff0c; 在人工智能技术日新月异的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的&#xff1f; 比如&#xff1a;当用户提到"…...

贪心算法(17)(java)可被三整除的最大整数和

给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素 最大和。 示例 1&#xff1a; 输入&#xff1a;nums [3,6,5,1,8] 输出&#xff1a;18 解释&#xff1a;选出数字 3, 6, 1 和 8&#xff0c;它们的和是 18&#xff08;可被 3 整除的最大和&#xff09;。 …...

qq邮箱群发程序

1.界面设计 1.1 环境配置 在外部工具位置进行配置 1.2 UI界面设计 1.2.1 进入QT的UI设计界面 在pycharm中按顺序点击&#xff0c;进入UI编辑界面&#xff1a; 点击第三步后进入QT的UI设计界面&#xff0c;通过点击按钮进行界面设计&#xff0c;设计后进行保存到当前Pycharm…...

K8S学习之基础七十九:关闭istio功能

关闭istio功能 kubectl get ns --show-labels kubectl label ns default istio-injection-有istio-injectionenabled的命名空间&#xff0c;pod都会开启istio功能 反之&#xff0c;如果要开启istio&#xff0c;在对应命名空间打上该标签即可...

上门预约洗鞋店小程序都具备哪些功能?

现在大家对洗鞋子的清洗条件越来越高&#xff0c;在家里不想去&#xff0c;那就要拿去洗鞋店去洗。如果有的客户没时间去洗鞋店&#xff0c;这个时候&#xff0c;有个洗鞋店小程序就可以进行上门取件&#xff0c;帮助没时间的客户去取需要清洗的鞋子&#xff0c;这样岂不是既帮…...

在Ubuntu 22.04上配置【C/C++编译环境】

在Ubuntu 22.04上配置C/C编译环境 如果你想在Ubuntu 22.04上编译和运行C或C程序&#xff0c;首先需要安装一个合适的编译器和相关工具。本文将为你提供详细的安装建议和操作步骤&#xff0c;帮助你快速搭建开发环境。 准备工作 在开始之前&#xff0c;确保你的系统可以通过终…...

蓝桥杯——走迷宫(Java-BFS)

这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制&#xff1a;广度优先搜索按层遍历所有可能的路径&#xff0c;首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用&#xff1a;通过队列按先进先出的顺序处理节点&#xff0c;确保每一步探索的都是当…...

Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比

一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver&#xff08;如StandardServletMultipartResolver&#xff09;需自行引入commons-fileupload等依赖无&#xff0c;默认不启用文件上传支…...

LLM 的model.generate() 参数说明

LLM 的model.generate() 参数说明 目录 LLM 的model.generate() 参数说明生成长度控制参数采样策略参数重复惩罚参数束搜索参数其他参数model.generate() 方法是 Hugging Face Transformers 库中用于文本生成的核心方法,它有众多参数可用于控制生成过程 生成长度控制参数 min…...

下载firefox.tar.xz后如何将其加入到Gnome启动器

起因&#xff1a;近期&#xff08;2025-04-07&#xff09;发现firefox公布了130.0 版本&#xff0c;可以对pdf文档进行签名了&#xff0c;想试一下&#xff0c;所以卸载了我的Debian12上的firefox-esr,直接下载了新版本的tar.xz 包。 经过一番摸索&#xff0c;实现了将其加入Gn…...

Flutter性能优化终极指南:从JIT到AOT的深度调优

一、Impeller渲染引擎调优策略 1.1 JIT预热智能预编译 // 配置Impeller预编译策略 void configureImpeller() {ImpellerEngine.precacheShaders(shaders: [lib/shaders/skinned_mesh.vert,lib/shaders/particle_system.frag],warmupFrames: 30, // 首屏渲染前预编译帧数cach…...

加密≠安全:文件夹密码遗忘背后的数据丢失风险与应对

在数字化时代&#xff0c;保护个人隐私和数据安全变得尤为重要。许多人选择对重要文件夹进行加密&#xff0c;以防止未经授权的访问。然而&#xff0c;一个常见且令人头疼的问题也随之而来——文件夹加密密码遗忘。当你突然发现自己无法访问那些加密的文件夹时&#xff0c;那种…...

实习技能记录【2】-----LVGL[基本概念]

LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 应用程序中的顶层容器。它是用户界面的根对象&#xff0c;所有的可见 UI 元素最终都会添加到某个屏幕上&#xff08;通常是活动屏幕&#xff09;。 功能: 作为其他 UI 元素的父对象。 可以拥有自己的背景颜色、背景图片等样…...

【操作系统(Linux)】——通过案例学习父子进程的线程异步性

本篇旨在通过几个案例来学习父子进程的线程异步性 一、父进程与子进程 我们将要做的&#xff1a; 创建父子进程&#xff0c;观察父子进程执行的顺序&#xff0c;了解进程执行的异步行为 源代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include…...

Go 语言范围 (Range)

Go 语言范围 (Range) Go 语言是一种静态强类型、编译型、并发型编程语言&#xff0c;由 Google 开发。它的简洁性和高效性使其成为众多开发者的首选。在 Go 语言中&#xff0c;range 是一个非常有用的关键字&#xff0c;用于遍历数组、切片、字符串以及通道&#xff08;channe…...