FEATURED · 精选文章

es-toolkit 中的 percentile 函数:基于最近秩法计算数值数组百分位数

发布时间 / 2026/9/17 4:32:56
来源 / 创域科博编辑部
栏目 / 资讯中心
es-toolkit 中的 percentile 函数:基于最近秩法计算数值数组百分位数 es-toolkit 中的 percentile 函数基于最近秩法计算数值数组百分位数【免费下载链接】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导读percentile是 es-toolkit 数学工具集es-toolkit/math中用于从数值数组计算指定百分位值的函数。它采用最近秩法Nearest rank method——将数组升序排序后返回最近秩位上的元素——非常适合在性能监控、统计分析、评分分布等场景中快速求取 P50、P75、P90 等分位指标。读完本文你将掌握percentile的完整 API 用法、边界行为与异常规则并能结合源码理解其底层实现原理。percentile 是什么百分位数描述的是数据中百分之 p 的观测值小于或等于该值的位置。percentile函数接收一个数值数组和一个百分位参数返回该百分位对应的值const value percentile(arr, p);其中p的取值范围为[0, 100]。50 百分位即中位数median75 百分位意味着数据中 75% 的值都小于等于它。与 es-toolkit 的 median 不同percentile是一个通用分位数工具median只处理正中间一个位置偶数长度时取中间两值的平均值而percentile可以计算任意百分位且采用最近秩法直接取数组中的实际元素不做插值。基本用法从es-toolkit/math导入后即可使用import { percentile } from es-toolkit/math; // 求数组的中位数50 百分位 const median percentile([1, 2, 3, 4, 5], 50); // median 为 3 // 求 75 百分位 const p75 percentile([1, 2, 3, 4, 5], 75); // p75 为 4 // 未排序的数组会自动排序 const result percentile([50, 10, 30, 20, 40], 50); // result 为 30 // 0 百分位返回最小值 const min percentile([5, 1, 4, 2, 3], 0); // min 为 1 // 空数组返回 NaN const empty percentile([], 50); // empty 为 NaNAPI 参考percentile(arr, percentile)参数arrreadonly number[]用于计算百分位的数值数组。声明为readonly函数内部不会修改原数组。percentilenumber要计算的百分位必须位于[0, 100]闭区间内。返回值number指定百分位对应的数值。若数组为空返回NaN。异常当percentile为NaN、小于0或大于100时函数抛出Error。从源码看实现原理percentile的实现位于 src/math/percentile.ts整体流程可以拆解为四步1. 参数校验依次检查百分位是否为NaN、是否小于0、是否大于100任一条件成立立即抛出带具体原因的错误信息如Expected percentile to be 0 but got -1.确保后续计算始终处于合法区间。2. 空数组短路若arr.length 0直接返回NaN避免对空数组做无意义计算。3. 拷贝并排序先通过arr.slice()拷贝一份数组保证不修改调用方的原数组再用比较器升序排序。值得注意的是排序比较器将NaN视为负无穷大Number.NEGATIVE_INFINITY因此NaN会被排到最前面——这是 src/math/percentile.spec.ts 中测试明确验证的行为。4. 最近秩法定位对percentile 0的特殊情况直接返回排序后的第一个元素其余情况按公式index Math.ceil(sorted.length * (percentile / 100)) - 1计算目标下标并返回对应元素。这一公式正是维基百科所描述的 Nearest rank method 的标准实现。实现调用链工具函数本体src/math/percentile.ts模块导出src/math/index.tsexport { percentile } from ./percentile.ts;并通过 src/index.ts 汇入包的总入口测试覆盖src/math/percentile.spec.ts共 12 组用例边界行为与测试验证es-toolkit 的单元测试对percentile的边界行为做了全面覆盖理解这些行为有助于在实际项目中规避陷阱场景输入结果依据0 百分位[5, 1, 4, 2, 3], 01最小值percentile.spec.ts100 百分位[5, 1, 4, 2, 3], 1005最大值percentile.spec.ts奇数长度中位数[1, 2, 3, 4, 5], 503percentile.spec.ts1~100 序列的 P25/P50/P75Array.from({length: 100}, (_, i) i 1)25/50/75percentile.spec.ts未排序输入[50, 10, 30, 20, 40], 5030percentile.spec.ts负数[-1, -2, -3, -4, -5], 50-3percentile.spec.ts含 NaN[NaN, NaN, 1, 100], 751percentile.spec.ts不修改原数组[5, 1, 4, 2, 3], 50原数组保持不变percentile.spec.ts空数组[], 50NaNpercentile.spec.ts非法百分位NaN/-1/101抛出Errorpercentile.spec.ts几个容易被忽视的要点不修改原数组函数内部对arr执行了slice()拷贝测试专门验证了调用后输入数组的顺序不被改变。如果你的代码依赖原数组顺序可以放心传入。NaN 处理数组中的NaN会被当作最小值参与排序而非抛出异常因此含NaN的数组仍能返回结果这一点在调用方需要留意。100 百分位由公式Math.ceil(n * 1) - 1 n - 1自然得到最后一个元素即最大值。实际应用场景percentile适合在需要阈值分布而不是单一均值的场景中使用性能监控对接口延迟样本计算 P50/P95/P99比平均值更能反映真实体验评分与排名将成绩、评分等分布数据按百分位划分档位数据清洗与异常检测用高百分位值作为上限阈值过滤离群点。例如统计一组请求耗时样本的 90 百分位import { percentile } from es-toolkit/math; const latencies [120, 85, 230, 95, 310, 150, 88, 200, 105, 175]; // 求 P90作为性能预警阈值 const p90 percentile(latencies, 90);小结percentile以最近秩法为核心将百分位计算收敛为一次排序加一次下标定位实现简洁、行为确定[0, 100]之外的百分位会抛出异常空数组返回NaNNaN元素按最小值参与排序且全程不修改原数组。配合 percentile.spec.ts 中的完整用例你可以放心在统计与监控类代码中直接使用或以此为基础实现更复杂的插值型分位数逻辑。【免费下载链接】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),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻