跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
JavaScript数组归约
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= JavaScript数组归约 = '''数组归约'''(Array Reduction)是JavaScript中一种强大的数组处理方法,它通过遍历数组元素,将其“缩减”为单个值。`reduce()`方法是实现这一功能的核心工具,广泛应用于求和、数据转换、聚合计算等场景。 == 基本概念 == 数组归约的核心思想是: * 遍历数组的每个元素 * 通过'''归约函数'''(reducer function)将当前值与前一结果合并 * 最终返回单个累积值 数学上可以表示为: <math> \text{reduce}(arr) = f(f(f(f(init, a_0), a_1), a_2), \dots, a_n) </math> 其中: * <code>f</code> 是归约函数 * <code>init</code> 是初始值(可选) * <code>a_0</code>到<code>a_n</code>是数组元素 == 语法结构 == <source lang="javascript"> array.reduce(reducerFunction[, initialValue]) </source> 参数说明: {| class="wikitable" |- ! 参数 !! 描述 |- | reducerFunction || 执行每个元素的函数,接收4个参数: * '''accumulator''':累积值 * '''currentValue''':当前元素 * '''currentIndex'''(可选):当前索引 * '''array'''(可选):原数组 |- | initialValue || (可选)作为第一次调用reducerFunction时的accumulator值 |} == 基础示例 == === 求和计算 === <source lang="javascript"> const numbers = [1, 2, 3, 4]; const sum = numbers.reduce((acc, curr) => acc + curr, 0); console.log(sum); // 输出:10 </source> 执行过程可视化: <mermaid> flowchart LR A[初始值: 0] --> B[0 + 1 = 1] B --> C[1 + 2 = 3] C --> D[3 + 3 = 6] D --> E[6 + 4 = 10] </mermaid> === 查找最大值 === <source lang="javascript"> const values = [5, 2, 9, 1, 7]; const max = values.reduce((a, b) => Math.max(a, b), -Infinity); console.log(max); // 输出:9 </source> == 高级应用 == === 数据转换 === 将对象数组转换为键值映射: <source lang="javascript"> const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]; const userMap = users.reduce((map, user) => { map[user.id] = user; return map; }, {}); console.log(userMap); /* 输出: { "1": { id: 1, name: "Alice" }, "2": { id: 2, name: "Bob" }, "3": { id: 3, name: "Charlie" } } */ </source> === 多维数组扁平化 === <source lang="javascript"> const nested = [[1, 2], [3, 4], [5, 6]]; const flat = nested.reduce((acc, curr) => acc.concat(curr), []); console.log(flat); // 输出:[1, 2, 3, 4, 5, 6] </source> == 实际案例 == === 购物车总价计算 === <source lang="javascript"> const cart = [ { item: 'Book', price: 15.99, quantity: 2 }, { item: 'Pen', price: 4.99, quantity: 3 }, { item: 'Notebook', price: 9.99, quantity: 1 } ]; const total = cart.reduce((sum, product) => { return sum + (product.price * product.quantity); }, 0); console.log(total.toFixed(2)); // 输出:"55.95" </source> === 词频统计 === <source lang="javascript"> const text = "apple banana orange apple orange apple"; const words = text.split(' '); const frequency = words.reduce((stats, word) => { stats[word] = (stats[word] || 0) + 1; return stats; }, {}); console.log(frequency); /* 输出: { "apple": 3, "banana": 1, "orange": 2 } */ </source> == 注意事项 == 1. '''初始值的重要性''': - 无初始值时,使用数组第一个元素作为初始accumulator - 空数组无初始值会抛出TypeError 2. '''不可变原则''': - reducer应该是纯函数,不修改原数组 - 每次都应返回新的accumulator 3. '''执行顺序''': - 有初始值时从索引0开始 - 无初始值时从索引1开始 == 性能考虑 == 对于大型数组: * reduce()通常比链式调用filter()+map()更高效 * 但简单循环有时性能更好 * 考虑使用Web Workers处理超大数据集 == 总结 == JavaScript数组归约是一个多功能的工具,可以: * 替代许多循环场景 * 实现复杂的数据转换 * 保持代码声明式和简洁 * 处理各种聚合计算 掌握reduce()方法能显著提升处理数组数据的效率和代码可读性。 [[Category:编程语言]] [[Category:JavaScript]] [[Category:Javascript数组]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)