JavaScript如何实现函数式编程_map和reduce怎么使用

发布时间 - 2025-12-29 00:00:00    点击率:
JavaScript中map和reduce是核心高阶函数:map实现“一对一映射”,返回新数组;reduce实现“归约聚合”,返回单一值;二者均不修改原数组,支持不可变数据流与链式组合,但需避免回调中的副作用。

JavaScript 支持函数式编程的核心思想:把函数当值来传递、组合和复用,mapreduce 就是其中最常用、最典型的高阶函数。

map:对每个元素做变换,返回新数组

map 不修改原数组,而是遍历每个元素,用你提供的函数处理它,再把结果按顺序放进一个新数组里。它关注“一对一映射”。

  • 语法:arr.map(callback(element, index, array))
  • callback 必须有返回值,否则新数组对应位置是 undefined
  • 常见用途:格式化数据、提取字段、类型转换

例子:

const numbers = [1, 2, 3];
const doubled = numbers.map(x => x * 2); // [2, 4, 6]

const users = [{name: 'Alice'}, {name: 'Bob'}];
const names = users.map(u => u.name); // ['Alice', 'Bob']

reduce:把数组“折叠”成一个值

reduce 更灵活也更强大,它逐个处理元素,把前一次的结果(累加器)和当前元素一起交给你的函数,最终产出一个单一值。它关注“归约聚合”。

  • 语法:arr.reduce(callback(accumulator, currentValue, index, array), initialValue)
  • initialValue 可选;不传时,第一次调用以第0项为 accumulator,第1项为 currentValue
  • 务必确保 callback 总是返回 accumulator 的下一个状态,否则会出错

例子:

const nums = [1, 2, 3, 4];
const sum = nums.reduce((acc, curr) => acc + curr, 0); // 10

const words = ['hello', 'world'];
const sentence = words.reduce((acc, word) => acc + ' ' + word, '').trim(); // 'hello world'

// 按属性分组
const pets = [{type:'dog', name:'Leo'}, {type:'cat', name:'Mia'}];
const grouped = pets.reduce((obj, pet) => {
  obj[pet.type] = obj[pet.type] || [];
  obj[pet.type].push(pet);
  return obj;
}, {}); // { dog: [...], cat: [...] }

map 和 reduce 的组合很常见

函数式风格常把多个操作链起来:先 map 转换结构,再 filter 筛选,最后 reduce 汇总。它们都返回新数组或新值,天然支持不可变数据流。

const orders = [
  {id: 1, amount: 150, status: 'completed'},
  {id: 2, amount: 80, status: 'pending'},
  {id: 3, amount: 200, status: 'completed'}
];

// 计算已完成订单的总金额
const total = orders
  .filter(o => o.status === 'completed')
  .map(o => o.amount)
  .reduce((sum, amt) => sum + amt, 0); // 350

注意点:别滥用,也别忽略副作用

mapreduce 是纯函数的理想载体,但如果你在回调里改了外部变量、发请求、操作 DOM,就破坏了函数式原则。保持回调无副作用,才能真正获得可预测、易测试的好处。

  • 避免在 map/reduce 回调中修改原数组或外部对象
  • 需要副作用(如打印、请求)时,优先考虑 forEach,而不是硬塞进 map/reduce
  • 性能敏感场景下,链式调用会产生中间数组;必要时可用 for 循环替代


# javascript  # word  # java  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Java垃圾回收器的方法和原理总结  5种Android数据存储方式汇总  如何用VPS主机快速搭建个人网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel如何创建自定义Artisan命令?(代码示例)  如何在阿里云完成域名注册与建站?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在云服务器上快速搭建个人网站?  如何在Tomcat中配置并部署网站项目?  如何利用DOS批处理实现定时关机操作详解  利用 Google AI 进行 YouTube 视频 SEO 描述优化  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  海南网站制作公司有哪些,海口网是哪家的?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  详解MySQL数据库的安装与密码配置  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何快速搭建安全的FTP站点?  如何快速搭建高效服务器建站系统?  网站优化排名时,需要考虑哪些问题呢?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel如何使用Blade组件和插槽?(Component代码示例)  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  香港服务器部署网站为何提示未备案?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  java ZXing生成二维码及条码实例分享  如何用wdcp快速搭建高效网站?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何快速使用云服务器搭建个人网站?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  创业网站制作流程,创业网站可靠吗?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Python进程池调度策略_任务分发说明【指导】  WEB开发之注册页面验证码倒计时代码的实现  在线教育网站制作平台,山西立德教育官网?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel如何处理异常和错误?(Handler示例)