es-toolkit 的 meanBy 函数:按取值函数计算数组平均值的完整指南

发布时间:2026/9/16 17:47:19

es-toolkit 的 meanBy 函数:按取值函数计算数组平均值的完整指南 es-toolkit 的 meanBy 函数按取值函数计算数组平均值的完整指南【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkitmeanBy是 es-toolkit 数学模块中用于先映射、再求平均的高阶聚合函数它对数组的每个元素应用getValue函数将元素转换为数值再计算这些数值的平均值。当需要从对象数组中提取某个属性求均值、或对元素做变换后再求均值时meanBy比手动reduce更简洁直观。读完本文你将掌握meanBy的调用方式、参数语义、空数组的NaN边界行为、底层实现原理以及它与mean、sumBy和 lodash 兼容版本之间的关系。meanBy 是什么meanBy的定义与mean一脉相承mean直接对数值数组求平均而meanBy允许你传入一个取值函数将任意类型T的数组元素映射为number后再求平均。const average meanBy(items, getValue);它的核心签名如下function meanByT(items: readonly T[], getValue: (element: T) number): number;items任意类型的只读数组元素类型为TgetValue从每个元素中提取数值的回调函数返回值getValue计算出的所有数值的平均值若数组为空则返回NaN。典型的使用场景包括从对象数组中计算某个数值属性的平均值如平均年龄、平均分数对元素做变换后再求平均值如字符串的平均长度在统计、报表、图表数据预处理中批量计算聚合指标。使用方法导入方式与 es-toolkit 其他数学函数一致import { meanBy } from es-toolkit/math;计算对象数组特定属性的平均值// オブジェクト配列から特定のプロパティの平均を計算します const people [{ age: 23 }, { age: 25 }, { age: 27 }]; const averageAge meanBy(people, person person.age); // averageAgeは25になります ((23 25 27) / 3 75 / 3 25)getValue逐个取出person.age得到[23, 25, 27]平均值为25。这一模式等价于people.reduce((sum, p) sum p.age, 0) / people.length但语义更聚焦于求平均本身。计算字符串长度的平均值// 文字列の長さの平均を計算します const words [apple, banana, cherry]; const averageLength meanBy(words, word word.length); // averageLengthは約5.67になります ((5 6 6) / 3 ≈ 5.67)这里元素类型T是stringgetValue将每个单词映射为其长度得到(5 6 6) / 3 ≈ 5.67。空数组返回 NaN// 空の配列の場合はNaNを返します const emptyResult meanBy([], x x); // emptyResultはNaNになりますmeanBy对空数组返回NaN这一点与mean一致而与sumBy不同sumBy对空数组返回0。使用时应先判断数组是否为空或接受NaN作为无数据的信号。参数与返回值项目说明itemsreadonly T[]参与平均计算的数组getValue(element: T) number从每个元素中提取数值的函数返回值number按getValue计算出的所有数值的平均值空数组返回NaN源码实现基于 sumBy 的组合meanBy的实现非常精简完整源码位于 src/math/meanBy.tsimport { sumBy } from ./sumBy; export function meanByT(items: readonly T[], getValue: (element: T) number): number { return sumBy(items, item getValue(item)) / items.length; }从源码结构可以看出两个关键实现事实它建立在sumBy之上先用sumBy对每个元素应用getValue并累加再除以items.length。sumBy的实现位于 src/math/sumBy.ts内部是一个普通for循环累加没有使用reduce从而避免了额外的函数调用开销export function sumByT(items: readonly T[], getValue: (element: T, index: number) number): number { let result 0; for (let i 0; i items.length; i) { result getValue(items[i], i); } return result; }注意sumBy的getValue回调会收到第二个参数index从 0 开始而meanBy在转发时只传了元素本身因此meanBy的getValue仅接收元素一个参数。空数组的NaN源自除以零当items为空时sumBy返回0而0 / 0在 JavaScript 中结果为NaN这与 src/math/mean.ts 中mean的实现sum(nums) / nums.length保持完全一致的行为。也就是说空数组返回NaN并非显式判断而是0 / 0的自然结果。测试用例验证仓库为meanBy提供了单元测试见 src/math/meanBy.spec.tsdescribe(meanBy, () { it(calculates the mean of values extracted from objects, () { const result meanBy([{ a: 1 }, { a: 2 }, { a: 3 }], x x.a); expect(result).toEqual(2); }); it(returns NaN for empty arrays, () { type Person { name: string; age: number }; const people: Person[] []; expect(meanBy(people, x x.age)).toEqual(NaN); }); });两个用例分别验证了对象属性求均值与空数组返回NaN这两个文档承诺的核心行为与官方文档描述一一对应可以作为使用时的行为契约参考。meanBy 与 mean、sumBy 的关系es-toolkit 的数学模块导出清单见 src/math/index.ts中这三个函数形成了清晰的层次函数输入空数组行为定位meanreadonly number[]NaN直接对数值数组求平均meanByreadonly T[] 取值函数NaN映射后再求平均sumByreadonly T[] 取值函数0映射后求和meanBy的底层依赖因此若你的数据已经是数值数组直接用mean即可若需要先提取或变换属性则用meanBy若只需要总和而不需要平均值应选择sumBy空数组时返回0而不是NaN在累加场景中更友好。lodash 兼容版 meanByes-toolkit 还在es-toolkit/compat入口下提供了与 lodash 行为对齐的兼容版本实现位于 src/compat/math/meanBy.ts其iteratee参数支持更丰富的简写形式传入函数从元素中提取数值如x x.a传入字符串键名按属性路径取值如a传入数组[key, value]匹配具有指定键值对的元素传入对象匹配包含指定属性的元素不传iteratee时默认使用identity直接对元素本身求平均此时行为等同于对数值数组求mean。该版本还放宽了输入类型接受ArrayLikeT | null | undefined并对缺失属性做了特殊处理当某个元素的属性缺失或为undefined时按0计入分子但仍计入分母即数组长度例如meanBy([{ a: 1 }, {}], a)的结果是0.5若所有值都为undefined则结果仍为NaN。对应的行为测试见 src/compat/math/meanBy.spec.ts其中还覆盖了类数组对象{ 0: {...}, 1: {}, length: 2 }等边界输入。核心的meanBy非兼容版通过 src/math/index.ts 导出并随es-toolkit/math子路径对外提供兼容版则通过es-toolkit/compat入口提供便于从 lodash 迁移的代码无缝替换。使用建议与注意事项空数组处理meanBy对空数组返回NaN。在统计报表等场景中建议先判断items.length 0再决定展示占位值还是直接展示NaN。回调应返回 numbergetValue的返回值会被直接累加请确保它总是返回数值返回undefined、字符串等类型会得到不符合预期的结果。与sumBy搭配如果你同时需要总和与平均值可以基于一次sumBy的结果自行除以长度避免对同一数组遍历两次。从 lodash 迁移若你的代码原先依赖 lodash 的meanBy简写语法如meanBy(objects, a)应改用es-toolkit/compat的兼容版本标准es-toolkit/math的meanBy只接受函数形式的取值器。延伸阅读meanBy 源码 与 meanBy 单元测试mean 源码数值数组直接求平均sumBy 源码meanBy的底层求和实现数学模块导出清单meanBy所在的完整数学函数集合compat 版 meanBy 源码支持 lodash 简写语法的兼容实现数学模块英文参考文档 与日文参考文档【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/16 17:47:19

UR3草莓采摘系统:基于ArUco视觉闭环的ROS真实场景落地实践

简介:本资源是一套面向机器人开发与智能农业交叉领域的ROS实践项目,适用于高校自动化、人工智能及农业工程方向的本科生与研究生,解决草莓采摘场景下的视觉识别、位姿估计与机械臂协同控制等核心问题。压缩包共79个文件,包含24个头…

2026/9/16 17:47:19

古籍OCR前端实现:Vue+OpenCV.js浏览器端全流程处理

简介:本资源是一套基于VueJavaScript实现的古籍文字检测与识别系统完整源码,面向计算机类专业本科生、研究生及初学者,适用于毕业设计、课程设计、大作业及项目立项演示等实践场景。系统采用vue-cli构建,支持本地快速启动与多环境…

2026/9/16 18:42:25

大模型如何革新游戏开发:从自然语言到智能生成

1. 项目背景与行业观察最近参加了一场关于游戏开发与智能技术融合的行业闭门会,现场演示的几款原型产品让我深刻感受到,游戏行业的技术迭代速度正在以肉眼可见的方式加快。其中有个demo让我印象深刻:开发者仅用自然语言描述游戏规则&#xff…

2026/9/16 18:42:25

WristArc实战:用Bootstrap 5构建响应式手表电商页

简介:这是一份基于HTML、CSS与Bootstrap实现的时尚手表电商网站页面设计包,适合前端初学者或希望快速搭建电商展示页的开发者练习参考。资源围绕“WristArc”品牌构建了完整的浏览型站点界面,包含首页、列表、详情等常见页面模块,…

2026/9/16 18:42:25

Java自研轻量区块链毕设:医疗存证全链路实现

简介:本资源是一套基于Java开发的区块链医疗记录存储系统毕业设计完整方案,面向计算机、通信、人工智能等专业的本科生及指导教师,解决传统医疗数据孤岛、隐私难保障、共享不可溯等核心问题。压缩包为ZIP格式,大小11.22MB&#xf…

2026/9/16 18:42:25

CAD绘制一级圆柱齿轮减速器工程图全流程指南

1. 项目概述:CAD绘制一级圆柱齿轮减速器工程图刚入行的机械设计新人常会遇到一个经典练手项目——用CAD软件绘制一级圆柱齿轮减速器的装配图和零件图。这不仅是机械制图课程的常见作业,更是实际工作中齿轮传动设计的入门必备技能。我十年前第一次用AutoC…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码