首页 最新 热门 推荐

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

通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)

  • 25-02-22 02:41
  • 3782
  • 6892
blog.csdn.net

目录

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

1.1、基本语法

1.1.1、参数

1.1.2、提供参数与行为       

1.2、返回值

1.3、使用技巧

1.3.1、数据汇总 

1.3.2、条件筛选和映射

1.3.3、对象属性的扁平化

1.3.4、转换数据格式

1.3.5、聚合统计

1.3.6、处理树结构数据

1.3.7、性能优化

二、总结


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

1.1、基本语法

array.reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)

1.1.1、参数

        其中callback回调函数用于处理每个数组元素,最后返回一个累加值。

  • accumulator:累加器,累加回调的返回值(或提供的初始值)。
  • currentValue:当前元素。
  • currentIndex(可选):当前元素的索引。
  • array(可选):调用 reduce 的数组。

        initialValue(可选):作为累加器的起始值。如果没有提供,array 的第一个元素将用作累加器的初始值,currentValue 将从 array 的第二个元素开始。 

1.1.2、提供参数与行为       

  1. 如果提供了 initialValue,累加器将被设置为这个值,currentValue 将被设置为数组的第一个元素。
  2. 如果没有提供 initialValue,reduce 将从索引 1 开始遍历数组,并且数组的第一个元素将作为累加器的初始值,currentValue 将从数组的第二个元素开始。
  3. callback 函数被依次应用到每个数组元素上,直到所有元素都被处理完毕。
  4. reduce 方法最后返回累加器的最终值。

1.2、返回值

        一个累加值,准确来说是一个累加器,因为不一定是返回一个数值,也可以是数组等其他数据结构,这个结构主要由initialValue决定,比如initialValue是[],那么最后的累加器就是一个数组,根据回调函数决定往数组里添加什么内容。

1.3、使用技巧

        array.reduce()是用于将数组元素归纳(或“缩减”)为单个值的函数。

        应用场景:数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据、性能优化等。

1.3.1、数据汇总 

        在处理数据集时,经常需要对数据进行汇总,比如求和、求平均值、求最大/最小值等。

  1. // 在处理数据集时,经常需要对数据进行汇总,比如求和、求平均值、求最大/最小值等。
  2. const numbers = [1, 2, 3, 4, 5];
  3. const total = numbers.reduce((acc, val) => acc + val, 0); // 求和
  4. const average = numbers.reduce((acc, val) => acc + val, 0) / numbers.length; // 求平均值

1.3.2、条件筛选和映射

        array.reduce()是可以结合条件判断,用于创建一个新数组,其中只包含满足特定条件的元素。

  1. // reduce() 可以结合条件判断,用于创建一个新数组,其中只包含满足特定条件的元素。
  2. const users = [
  3. { name: 'Alice', age: 21 },
  4. { name: 'Bob', age: 25 },
  5. { name: 'Charlie', age: 20 }
  6. ];
  7. const adults = users.reduce((acc, user) => {
  8. if (user.age >= 18) acc.push(user);
  9. return acc;
  10. }, []);

1.3.3、对象属性的扁平化

        将嵌套的对象结构扁平化,便于后续处理。

  1. // 将嵌套的对象结构扁平化,便于后续处理。
  2. const data = {
  3. a: { x: 5, y: 6 },
  4. b: { x: 7, y: 8 }
  5. };
  6. // 方案1、使用reduce嵌套forEach(感谢yzxerha朋友提出的建议)
  7. const flattenedData = Object.keys(data).reduce((acc, key) => {
  8. Object.keys(data[key]).forEach((subKey) => {
  9. acc[key + "." + subKey] = data[key][subKey];
  10. });
  11. return acc;
  12. }, {});
  13. // 方案2、使用双层reduce嵌套,为了规避双层对象嵌套,将内层的累加起始值设置为外层累加器
  14. // 就能实现内层键值对均累加到外层累加器中,实现双层reduce嵌套结果为单层对象的效果
  15. const flattenedData = Object.keys(data).reduce((acc, key) => {
  16. return Object.keys(data[key]).reduce((a, k) => {
  17. a[key + "." + k] = data[key][k];
  18. return a;
  19. }, acc);
  20. }, {});
  21. /**
  22. * flattenedData ={
  23. * 'a.x': 5,
  24. * 'a.y': 6,
  25. * 'b.x': 7,
  26. * 'b.y': 8
  27. * }
  28. //

1.3.4、转换数据格式

        将数据从一种格式转换到另一种格式,比如将数组转换为对象。

  1. // 将数据从一种格式转换到另一种格式,比如将数组转换为对象。
  2. const arrayOfKeyValuePairs = [['key1', 'value1'], ['key2', 'value2']];
  3. const obj = arrayOfKeyValuePairs.reduce((acc, [key, value]) => {
  4. acc[key] = value;
  5. return acc;
  6. }, {});

1.3.5、聚合统计

        在处理日志数据或其他需要聚合统计的场景中,array.reduce()可以用于计算不同分类下的统计数据。

  1. // 在处理日志数据或其他需要聚合统计的场景中,reduce() 可以用于计算不同分类下的统计数据。
  2. const salesData = [
  3. { date: '2021-01-01', product: 'Apple', amount: 10 },
  4. { date: '2021-01-02', product: 'Apple', amount: 5 },
  5. { date: '2021-01-01', product: 'Banana', amount: 20 },
  6. { date: '2021-01-01', product: 'Apple', amount: 20 },
  7. // ... 更多数据
  8. ];
  9. const salesSummary = salesData.reduce((acc, sale) => {
  10. const key = sale.date + '-' + sale.product;
  11. if (!acc[key]) {
  12. acc[key] = { ...sale, total: 0 };
  13. }
  14. acc[key].total += sale.amount;
  15. return acc;
  16. }, {});
  17. // 以该数据为例,结果就会是
  18. /**
  19. * {
  20. * "2021-01-01-Apple": { date: '2021-01-01', product: 'Apple', amount: 20, total: 30 },
  21. * "2021-01-02-Apple": { date: '2021-01-02', product: 'Apple', amount: 5, total: 5 },
  22. * "2021-01-01-Banana": { date: '2021-01-01', product: 'Banana', amount: 20, total: 20 }
  23. * // ... 更多数据,如果有的话
  24. * }
  25. */

1.3.6、处理树结构数据

        在处理树状结构的数据时,array.reduce() 可以用来递归地构建一个树形结构。

  1. // 在处理树状结构的数据时,reduce() 可以用来递归地构建一个树形结构。
  2. const treeData = [
  3. { id: 1, parent: null },
  4. { id: 2, parent: 1 },
  5. { id: 3, parent: 1 },
  6. { id: 4, parent: 3 },
  7. { id: 5, parent: 3 },
  8. { id: 6, parent: null }, // 另一个根节点
  9. { id: 7, parent: 6 },
  10. { id: 8, parent: 2 },
  11. { id: 9, parent: 2 },
  12. { id: 10, parent: 8 }
  13. ];
  14. const buildTree = (data) => {
  15. const tree = data.reduce((acc, item) => {
  16. acc[item.id] = item;
  17. // 判断是否存在parent节点
  18. if (item.parent) {
  19. // 如果acc[item.parent].children属性不存在,就添加一个[]值
  20. acc[item.parent].children = acc[item.parent].children || [];
  21. // 将子节点添加到父节点中
  22. acc[item.parent].children.push(acc[item.id]);
  23. }
  24. return acc;
  25. }, {});
  26. return Object.values(tree).filter((node) => node.parent === null);
  27. };
  28. const tree = buildTree(treeData);
  29. // 执行完之后,tree的值为:
  30. const tree =
  31. [
  32. {
  33. id: 1,
  34. parent: null,
  35. children: [
  36. { id: 2, parent: 1, children: [{ id: 8, parent: 2, children: [] }, { id: 9, parent: 2, children: [] }] },
  37. { id: 3, parent: 1, children: [{ id: 4, parent: 3, children: [] }, { id: 5, parent: 3, children: [] }] }
  38. ]
  39. },
  40. {
  41. id: 6,
  42. parent: null,
  43. children: [{ id: 7, parent: 6, children: [] }]
  44. }
  45. ]

1.3.7、性能优化

        在某些情况下,array.reduce()可以用于优化性能,因为它允许在单一的遍历中完成复杂的操作,减少了迭代次数。

  1. // 在某些情况下,reduce() 可以用于优化性能,因为它允许在单一的遍历中完成复杂的操作,减少了迭代次数。
  2. // 假设有一个大型数组,需要执行一个复杂的操作
  3. const largeArray = /* ... */;
  4. const result = largeArray.reduce((accumulator, item) => {
  5. // 执行复杂操作并更新accumulator
  6. return accumulator;
  7. }, initialValue);

二、总结

        array.reduce()可以用来数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据、性能优化等,使用难度相对高一些,但是能大大减少代码量。

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

        更多前端精彩分享请移步:各种前端问题的技巧和解决方案

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

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

/ 登录

评论记录:

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

分类栏目

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