首页 最新 热门 推荐

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

多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解

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

目录

一、array.flat()方法

1.1、array.flat()的语法及使用

①语法

②返回值

③用途

二、array.flatMap() 方法

2.1、array.flatMap()的语法及作用

①语法

②返回值

③用途

三、array.flat()与array.flatMap() 的主要区别

3.1、映射与展平

3.2、参数接受差异

3.3、适用场景的差异

3.3.1、处理某种JSON响应数据

3.3.2、处理表格数据

3.3.3、处理用户评论(带有附加信息的数据)

3.3.4、处理文件系统路径

四、总结


一、array.flat()方法

1.1、array.flat()的语法及使用

①语法

        array.flat()方法接受一个可选的参数,该参数指定要展平的深度。如果不提供参数,默认深度为1,意味着它只会展平一层嵌套数组。如果该参数为Infinity,则将数组完全展开(为一维数组)。

②返回值

        返回一个新数组,其中包含原数组及其所有子数组的元素。

③用途

        array.flat()方法用于将一个嵌套数组(数组中的数组)展平成一个一维数组。

        当处理嵌套数组时,array.flat()非常有用,特别是需要将数组简化为单一维度,以便进行迭代或其他操作。

  1. // 基本语法示范
  2. const nestedArray = [1, [2, [3, 4]], 5];
  3. const flatArray = nestedArray.flat(); // 默认深度为1,结果为 [1, 2, [3, 4], 5]
  4. const deeplyFlatArray = nestedArray.flat(2); // 深度为2,结果为 [1, 2, 3, 4, 5]

二、array.flatMap() 方法

2.1、array.flatMap()的语法及作用

①语法

        array.flatMap()方法接受一个映射函数作为参数,该函数定义了如何转换数组中的每个元素。

②返回值

        返回一个新数组,其中包含映射函数返回的每个数组的展平元素。

③用途

        array.flatMap()方法不仅将嵌套数组展平,还允许你指定一个映射函数来转换数组中的每个元素,然后再进行展平。

        array.flatMap()在你需要在展平数组的同时对数组元素进行某种转换时非常有用。例如,当你需要将每个元素复制或转换为另一种形式时。

  1. // 基础用法示范
  2. const numbers = [1, 2, 3, 4];
  3. const flatMappedArray = numbers.flatMap(num => [num, num * 2]); // 结果为 [1, 2, 2, 4, 3, 6, 4, 8]

三、array.flat()与array.flatMap() 的主要区别

3.1、映射与展平

        array.flat()仅负责展平数组,不涉及元素的转换;array.flatMap()结合了映射和展平,允许你在展平之前对元素进行转换。

        这里就有点像array.map + array.flat() - 超过1层的展平 = array.flatMap()。这个方法的语义化很明显,但是也可以通过嵌套的使用来实现基于array.flatMap()的映射和高维展平。

  1. // flatMap中嵌套flat来实现复杂的展平
  2. const complexArray = [
  3. { strings: ['a', 'b'], numbers: [1, 2] },
  4. { strings: ['c', 'd'], numbers: [3, 4] }
  5. ];
  6. const result = complexArray.flatMap(obj => {
  7. // 首先,使用flatMap映射每个字符串到一个包含字符串和对应数字的数组
  8. return obj.strings.flatMap(str => {
  9. // 然后,再次使用flatMap映射每个数字到一个包含字符串和数字的数组
  10. return obj.numbers.map(num => [str, num]);
  11. });
  12. }).flat(Infinity); // 使用Infinity确保所有层级都被展平
  13. console.log(result);
  14. // 结果为:
  15. [
  16. 'a', 1, 'a', 2, 'b', 1, 'b', 2,
  17. 'c', 3, 'c', 4, 'd', 3, 'd', 4
  18. ]
  19. const result2 = complexArray.flatMap(obj => {
  20. // 对于每个对象,创建一个由字符串和数字组成的子数组的新数组
  21. return obj.strings.flatMap(str => {
  22. // 对于每个字符串,创建一个由该字符串和每个数字组成的子数组
  23. return obj.numbers.map(num => [str, num]);
  24. });
  25. });
  26. console.log(result2);
  27. // 结果为:
  28. [
  29. ['a', 1], ['a', 2], ['b', 1], ['b', 2],
  30. ['c', 3], ['c', 4], ['d', 3], ['d', 4]
  31. ]

3.2、参数接受差异

        array.flat()接受一个可选的深度参数。其中Infinity可以将数组展平到一维。

        array.flatMap()接受一个映射函数作为参数。如果要进行跨纬度展平(比如三维展平成一维),需要使用嵌套或者链式调用。

3.3、适用场景的差异

        当你只需要简单地展平数组时,使用array.flat()。

        当你需要在展平数组的同时对数组元素进行转换时,使用array.flatMap()。

        以下案例能帮你更好的理解rray.flat()与array.flatMap() 的使用场景差异:

3.3.1、处理某种JSON响应数据

        假设你从API获取了一个JSON响应,其中包含了嵌套的数组数据,你需要将这些数据展平以便于进一步处理。

  1. // API响应如下:
  2. const apiResponse = [[{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }], [{ id: 3, name: 'Charlie' }]];
  3. // 使用.flat()来展平嵌套数组:
  4. const flatUsers = apiResponse.flat();
  5. console.log(flatUsers); // 输出: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }]
  6. // 假设我们需要筛选出ID大于2的用户,并且转换为只包含ID的数组:
  7. const filteredUsersIds = apiResponse.flat().filter(user => user.id > 2).map(user => user.id);
  8. console.log(filteredUsersIds); // 输出: [3]

3.3.2、处理表格数据

        在一个Web应用中,你有一个表格,每行代表一个项目,每个项目有多个属性。现在你需要将这些属性展平,以便在图表中展示。

  1. // 表格数据如下:
  2. const tableData = [
  3. { project: 'A', attributes: ['Size', 'Color'] },
  4. { project: 'B', attributes: ['Weight', 'Material'] }
  5. ];
  6. // 使用.flat()来展平属性数组:
  7. const flatAttributes = tableData.flatMap(row => row.attributes);
  8. console.log(flatAttributes); // 输出: ['Size', 'Color', 'Weight', 'Material']
  9. // 假设我们需要创建一个包含项目和属性的数组:
  10. const projectAttributes = tableData.flatMap(row => row.attributes.map(attr => [row.project, attr]));
  11. console.log(projectAttributes); // 输出: [['A', 'Size'], ['A', 'Color'], ['B', 'Weight'], ['B', 'Material']]

3.3.3、处理用户评论(带有附加信息的数据)

        在一个社交媒体应用中,用户可以对帖子进行评论,每个评论可能包含多个回复。你需要将所有评论和回复展平,以便进行搜索或索引。

  1. // 假设评论数据如下:
  2. const comments = [
  3. { user: 'User1', comment: 'Great post!', replies: ['Reply1', 'Reply2'] },
  4. { user: 'User2', comment: 'Thanks!', replies: ['Reply3'] }
  5. ];
  6. // 使用.flat()来展平回复数组:
  7. const flatReplies = comments.flatMap(comment => comment.replies);
  8. console.log(flatReplies); // 输出: ['Reply1', 'Reply2', 'Reply3']
  9. // 假设我们需要创建一个包含用户和评论/回复的数组:
  10. const commentReplies = comments.flatMap(comment =>
  11. comment.replies.map(reply => ({ user: comment.user, text: reply }))
  12. );
  13. console.log(commentReplies); // 输出: [{ user: 'User1', text: 'Reply1' }, { user: 'User1', text: 'Reply2' }, { user: 'User2', text: 'Reply3' }]

3.3.4、处理文件系统路径

        在一个文件管理应用中,你需要处理文件系统路径,这些路径可能是嵌套的。

  1. // 假设文件路径如下:
  2. const filePaths = [['Documents', 'Projects'], ['Pictures', ['Holiday', 'Birthday']]];
  3. // 使用.flat()来展平路径数组:
  4. const flatPaths = filePaths.flat(2); // 指定深度为2
  5. console.log(flatPaths); // 输出: ['Documents', 'Projects', 'Pictures', 'Holiday', 'Birthday']
  6. // 假设我们需要为每个路径添加文件类型:
  7. const fileTypes = [['Documents', '.txt'], ['Pictures', ['Holiday', '.jpg'], ['Birthday', '.png']]];
  8. const formattedPaths = fileTypes.flatMap(dir =>
  9. dir.flatMap(file => file.endsWith('.jpg') ? [`Image: ${file}`] : [])
  10. );
  11. console.log(formattedPaths); // 输出: ['Image: Holiday.jpg']

四、总结

        理论上array.flat()能做的事情,array.flatMap()都可以做,但是array.flat()更简单,占用内存更少,执行更快。

        这个相对冷门一些,w3school上都没有相关教程,看到就是赚到,收藏就是财富!

        丰富的前端内容请看:各种前端问题的技巧和解决方案

        自引链接:多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!

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

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

/ 登录

评论记录:

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

分类栏目

后端 (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