首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-02-22 02:41
  • 2474
  • 5216
blog.csdn.net

目录

一、array.map()的使用与技巧

1.1、基本语法

1.2、返回值

1.3、使用技巧

1.3.1、数据转换与应用函数

1.3.2、创建派生数组

1.3.3、链式调用

1.3.4、异步数据流处理

1.3.5、复杂API请求梳理

1.3.6、提供DOM操作

1.3.7、用来搜索和过滤

二、总结


一、array.map()的使用与技巧

1.1、基本语法

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

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

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

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

1.2、返回值

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

1.3、使用技巧

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

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

1.3.1、数据转换与应用函数

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

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

  1. // 创建一个新的数组,其中每个元素是一个对象,包含订单的 id、订单总金额、订单日期以及基于总金额计算的税费
  2. // 其中如果总金额小于1000,则税费为总金额的10%,否则为100
  3. // 示例订单数组
  4. const orders = [
  5. { id: 1, date: '2023-04-01', items: [{ name: 'Item1', price: 100, quantity: 2 }], shipping: 50 },
  6. { id: 2, date: '2023-04-02', items: [{ name: 'Item2', price: 200, quantity: 1 }], shipping: 30 },
  7. // ... 更多订单
  8. ];
  9. // 税费计算函数
  10. function calculateTax(totalAmount) {
  11. return totalAmount < 1000 ? totalAmount * 0.1 : 100;
  12. }
  13. // 创建新数组,包含每个订单的id, 总金额, 订单日期和税费
  14. const orderDetails = orders.map(order => {
  15. const totalAmount = order.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  16. const tax = calculateTax(totalAmount);
  17. return {
  18. id: order.id,
  19. totalAmount: totalAmount + order.shipping + tax, // 包括运费和税费的最终总金额
  20. date: order.date,
  21. tax: tax
  22. };
  23. });
  24. console.log(orderDetails);
  25. // 输出:
  26. [
  27. {
  28. id: 1,
  29. totalAmount: 300, // 100 * 2 (items) + 50 (shipping) + 20 (tax)
  30. date: '2023-04-01',
  31. tax: 20
  32. },
  33. {
  34. id: 2,
  35. totalAmount: 330, // 200 * 1 (item) + 30 (shipping) + 30 (tax)
  36. date: '2023-04-02',
  37. tax: 30
  38. },
  39. // ... 更多订单详情
  40. ]

1.3.2、创建派生数组

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

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

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

1.3.3、链式调用

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

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

1.3.4、异步数据流处理

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

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

1.3.5、复杂API请求梳理

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

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

1.3.6、提供DOM操作

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

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

1.3.7、用来搜索和过滤

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

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

二、总结

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

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

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

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览62647 人正在系统学习中
注:本文转载自blog.csdn.net的Watermelo617的文章"https://blog.csdn.net/RenGJ010617/article/details/138466122"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top