资讯详情

30 seconds of code:JavaScript 数值数组数学运算完全指南(求和、均值、乘积、中位数、加权平均与标准差)

📅 2026/10/4 1:50:04 | 华诺云谱 👁 阅读
30 seconds of code:JavaScript 数值数组数学运算完全指南(求和、均值、乘积、中位数、加权平均与标准差)
教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载数值数组numeric array是 JavaScript 开发中使用频率最高的数据结构之一无论做数据统计、指标计算还是算法实现几乎都绕不开对数组进行数学运算。本文以 30-seconds-of-code 仓库中 numeric-array-math-operations.md 为核心骨架系统讲解如何使用原生 JavaScript 实现数组的求和sum、平均值average、乘积product、中位数median、加权平均weighted average与标准差standard deviation并结合仓库源码与配置深入剖析其底层原理、边界情况与实战延伸。读完本文你将掌握一套可直接复制到任何项目中的、基于Array.prototype.reduce()与Math内建对象的数组数学运算工具箱同时理解每种运算的适用场景与注意事项。预备知识变参函数与 reduce在深入各个运算之前有两个贯穿全文的 JavaScript 核心机制需要先厘清。第一变参variadic函数与展开运算符spread operator。本文中的部分工具函数被设计为变参函数即可以接受任意数量的参数。当你手头是一个数组时只需用展开运算符...将其展开后传入即可例如sum(...[1, 2, 3, 4])。这一约定让函数既可以接受松散参数也能直接处理数组用法非常灵活原文档以[!NOTE]形式特别提示了这一点。第二Array.prototype.reduce()。它是几乎所有数组数学运算的地基。reduce(callback, initialValue)从左到右遍历数组把每次回调的返回值作为下一次调用的 accumulator累加器继续传递。以0为初始值累加即得求和以1为初始值累乘即得乘积配合不同的回调逻辑还能派生出加权求和、方差计算等更复杂的运算。仓库中另一篇 partial-sum-array.md 展示了 reduce 在累积前缀和场景下的典型用法可以作为本教程的补充阅读。数组求和Sum数组的和就是把数组中所有数字相加的结果。这是最基础也是用途最广的数组运算。使用Array.prototype.reduce()以0为累加器初始值遍历时把每个元素累加进去即可const sum (...arr) [...arr].reduce((acc, val) acc val, 0); sum(1, 2, 3, 4); // 10 sum(...[1, 2, 3, 4]); // 10实现要点形参...arr将所有入参收集为数组[...arr]再复制一份避免后续操作若有影响原数组reduce((acc, val) acc val, 0)中初始值0至关重要——它保证了对空数组求和时返回0而不是抛出错误也保证了对负数、小数求和结果正确时间复杂度为O(n)n 为数组长度从实现结构看无法并行化这是单次线性遍历的必然成本。数组平均值Average数组的平均值是将数组中所有数字相加后再除以数组的长度所得的结果。实现思路与求和一致先求和再用Array.prototype.length除以元素个数const average (...arr) [...arr].reduce((acc, val) acc val, 0) / arr.length; average(...[1, 2, 3]); // 2 average(1, 2, 3); // 2实现要点与边界情况注意arr.length是形参...arr收集到的数组长度与[...arr]复制后的数组长度相同从实现可以推断当传入空数组时0 / 0会得到NaN调用方需要自行保证数组非空当数组较长或数值极大时先求和再除法的做法可能产生浮点精度累积误差必要时可改用逐项累加平均如acc (val - acc) / (i 1)来缓解——但这不是本工具函数的默认行为。数组乘积Product数组的乘积是将数组中所有数字相乘的结果。与求和几乎对称区别仅在于累加器初始值改为1乘法单位元回调由加法改为乘法const prod (...arr) [...arr].reduce((acc, val) acc * val, 1); prod(1, 2, 3, 4); // 24 prod(...[1, 2, 3, 4]); // 24实现要点初始值1是乘法运算的单位元保证空数组时返回1、单元素数组时返回该元素本身如果数组中含有0乘积必然为0如果含小数注意浮点数精度问题如prod(0.1, 0.2)会得到0.020000000000000004求积常用于阶乘、组合计数、概率连乘等场景仓库中 factorial.md 便是乘积思想在递归中的典型应用。数组中位数Median数组的中位数是数组排序后位于中间的那个数。若数组长度为奇数中位数就是中间那个元素若长度为偶数中位数则是中间两个数的平均值。实现上需要用到Array.prototype.sort()排序再依据长度奇偶取中点值const median arr { const mid Math.floor(arr.length / 2), nums [...arr].sort((a, b) a - b); return arr.length % 2 ! 0 ? nums[mid] : (nums[mid - 1] nums[mid]) / 2; }; median([5, 6, 50, 1, -5]); // 5逐步拆解[...arr]先做浅拷贝避免sort()原地修改调用方传入的数组——这是不可变性immutability实践的关键一步sort((a, b) a - b)传入数字比较器默认的字典序排序会把10排在2之前而a - b保证了真正的数值升序mid Math.floor(arr.length / 2)计算中间索引长度奇偶通过arr.length % 2 ! 0判断奇数直接取nums[mid]偶数取(nums[mid - 1] nums[mid]) / 2。示例验证[5, 6, 50, 1, -5]排序后为[-5, 1, 5, 6, 50]长度为 5奇数mid 2中位数为nums[2]即5。从实现可以推断空数组会返回undefined调用方应预先校验。数组加权平均Weighted Average数组的加权平均是将每个数字乘以对应的权重后求和再除以所有权重之和。与普通平均值不同加权平均允许某些数值对结果施加更大的影响力常用于成绩加权、投资组合收益率、用户评分聚合等真实场景。实现上依然以reduce()为核心但这次一次遍历同时维护两个累加值分子与分母const weightedAverage (nums, weights) { const [sum, weightSum] weights.reduce( (acc, w, i) { acc[0] acc[0] nums[i] * w; acc[1] acc[1] w; return acc; }, [0, 0] ); return sum / weightSum; }; weightedAverage([1, 2, 3], [0.6, 0.2, 0.3]); // 1.72727实现要点累加器是一个二元数组[0, 0]acc[0]累积数值 × 权重的加权和acc[1]累积权重和一次reduce遍历同时完成两项计算权重数组weights的长度应当与数值数组nums一致否则索引i取不到对应项会产生NaN调用方需自行保证长度匹配示例验证(1 × 0.6 2 × 0.2 3 × 0.3) / (0.6 0.2 0.3) 1.9 / 1.1 ≈ 1.72727从实现可以推断若所有权重之和为0结果将为Infinity或NaN因此权重数组不应全为零。加权思想在仓库中还有一处典型应用array-sample-shuffle-weighted-selection.md 中的weightedSample函数利用reduce()构建权重前缀和数组再结合Math.random()与findIndex()实现按概率抽样的功能与本节的加权平均互为补充。数组标准差Standard Deviation数组的标准差衡量的是数组中各数值偏离均值的程度。计算过程分为五步求均值 → 计算每个值与均值的差 → 将差值平方 → 求平方差的平均值即方差→ 对方差开平方根。基于Array.prototype.reduce()与Math.sqrt()可一次性实现均值、方差与标准差的组合计算。函数还提供一个可选第二参数usePopulation用于切换样本标准差与总体标准差const standardDeviation (arr, usePopulation false) { const mean arr.reduce((acc, val) acc val, 0) / arr.length; return Math.sqrt( arr .reduce((acc, val) acc.concat((val - mean) ** 2), []) .reduce((acc, val) acc val, 0) / (arr.length - (usePopulation ? 0 : 1)) ); }; standardDeviation([10, 2, 38, 23, 38, 23, 21]); // 13.284434142114991 (sample) standardDeviation([10, 2, 38, 23, 38, 23, 21], true); // 12.29899614287479 (population)分步拆解实现求均值arr.reduce((acc, val) acc val, 0) / arr.length与前面的average完全一致计算平方差数组arr.reduce((acc, val) acc.concat((val - mean) ** 2), [])将每个值与均值的差的平方收集成新数组**是 ES2016 的幂运算符等价于Math.pow(val - mean, 2)累加平方差第二个reduce对平方差数组求和分母的玄机arr.length - (usePopulation ? 0 : 1)是两种标准差的核心差异——usePopulation false默认样本标准差分母为n - 1即Bessel 校正贝塞尔修正用样本数据估计总体波动时补偿自由度损失结果偏保守usePopulation true总体标准差分母为n适用于你确实拥有全部数据而非抽样的场景。示例验证[10, 2, 38, 23, 38, 23, 21]均值为155 / 7 ≈ 22.142857平方差之和约为1058.857样本标准差√(1058.857 / 6) ≈ 13.2844总体标准差√(1058.857 / 7) ≈ 12.2990与注释结果一致。实现层面的注意点该实现将平方差先构造成一个中间数组再二次求和虽然直观易读但从实现结构看其空间复杂度为O(n)若需优化内存可在单次reduce中直接累加(val - mean) ** 2这里为了教学清晰性牺牲了内存从实现可以推断数组长度为1时样本标准差因n - 1 0会出现Infinity/NaN这是统计学本身的定义使然并非代码缺陷。仓库中的关联、重定向与延伸阅读该文档在仓库中的位置与聚合地位本工具文档位于 content/snippets/js/s/numeric-array-math-operations.md属于 JavaScript 文章体系标签为array, math与仓库中 content/collections/js/math.yamlJavaScript Math 文章集合等目录元数据对应。一个值得注意的事实是仓库的 content/redirects.yaml 中有14 条 301 重定向如/js/s/average、/js/s/sum、/js/s/prod、/js/s/median、/js/s/standard-deviation、/js/s/weighted-average等全部指向本文档路径/js/s/numeric-array-math-operations。这从项目配置层面印证了本文档是这些数学运算知识的统一汇聚入口也解释了为什么搜索引擎与站内链接最终都会落到这一篇上。从单数组运算到矩阵运算的延伸本文档在仓库中还被更高阶的内容引用。在 matrix-data-structure.mdMatrix 数据结构文章的 Additional math operations 一节中作者以Quick refresher的形式将本文档作为前置复习材料随后在此基础上实现了sum/sumPerRow/sumPerCol、prod、mean、variance、std、cumulativeSum等一系列矩阵级数学运算。例如矩阵版求和直接复用本文思路sum() { return this.reduce((acc, value) acc value, 0); }方差与标准差则建立在mean()与Math.pow()之上本质上是本文单数组实现向二维数组的推广。可见掌握本文的六个基础运算是进一步阅读仓库中矩阵、算法类文章的前提。相关主题文章导航围绕数值数组 数学运算这一主题仓库中还有以下内容可以延伸学习array-min-max.md数组的最小值/最大值、前 n 个最小/最大值以及基于映射函数的minBy/maxBypartial-sum-array.md基于reduce与slice的前缀和partial sum数组array-sample-shuffle-weighted-selection.md洗牌、随机抽样与加权抽样其中加权抽样用到了前缀和思想matrix-data-structure.md将上述运算推广到二维矩阵的完整封装类实现。总结一份可复用的数组数学运算工具箱综合全文你可以把以下六段函数作为项目中的通用工具直接复用运算核心实现初始值/分母典型场景sum(...arr)reduce累加0总额统计average(...arr)先求和再除arr.length分母n均值统计prod(...arr)reduce累乘1概率连乘、阶乘median(arr)拷贝 数值排序 取中点奇偶分治稳健中心趋势weightedAverage(nums, weights)二元累加器分母为权重和加权评分、组合收益standardDeviation(arr, usePopulation)均值 → 平方差 → 开方n或n - 1波动性、离散度分析使用时的三条通用守则保护原始数组涉及sort()的运算如median务必先用[...arr]拷贝避免原地修改注意边界输入空数组、长度不匹配的权重数组、全零权重、单元素数组等边界情况需由调用方预先校验本文工具函数默认不做防御留意浮点精度涉及小数累加累乘时JavaScript 的 IEEE 754 双精度浮点可能产生微小误差如0.1 0.2 ! 0.3对精度敏感的金融、统计场景应引入十进制运算库或舍入策略。掌握这些基础运算后你就可以顺着 matrix-data-structure.md 等进阶文章把一维数组的数学能力扩展到矩阵乃至更复杂的数据结构之上。赞分享教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载相关推荐CrapFixer Edge浏览器优化完整指南清理微软浏览器的烦人功能CrapFixer Edge浏览器优化完整指南清理微软浏览器的烦人功能 你是否厌倦了Microsoft Edge浏览器中那些烦人的广告、数据收集和预装垃圾功能终极JavaScript数学统计指南Just.js均值、中位数、标准差实战终极JavaScript数学统计指南Just.js均值、中位数、标准差实战 在JavaScript开发中处理数学统计计算是常见需求。Just.js提供了一套开发工具30 seconds of codeJavaScript 数组比较的完整实战指南30 seconds of codeJavaScript 数组比较的完整实战指南 导读 在 JavaScript 中比较两个数组是否相等是开发中最高频也教程文档上一篇WSL 容器 SDK 的 Component 枚举详解缺失组件检测与依赖安装WSL C API下一篇TalkToFigma 快速上手3 步接通 Cursor 与 FigmaAI 直接读写设计稿创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑