信息发布→ 登录 注册 退出

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

发布时间:2025-12-29

点击量:
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  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!