es-toolkitBigInt.maxBy完全指南从对象数组中找出派生BigInt值最大的元素【免费下载链接】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-toolkitBigInt.maxBy是 es-toolkit 在es-toolkit/bigint子路径下提供的专用函数用于在对象数组中依据每个元素派生出的BigInt值找出最大者并返回整个元素。本指南围绕 docs/ja/reference/bigint/maxBy.md 展开结合 源码实现 与 单元测试帮助你掌握它的签名、行为边界、平局处理、空数组异常以及与max、minBy、lodash 兼容版maxBy的差异从而在涉及大整数排序与选取的场景中正确选型。为什么需要专门的BigInt.maxByBigInt大整数可以表示远超Number安全整数范围Number.MAX_SAFE_INTEGER即 9007199254740991的整数值。但 JavaScript 内置的Math.max无法接收BigInt且普通数值比较在超大整数上会丢失精度。es-toolkit 为BigInt单独维护了一套 API见 src/bigint/index.ts包含clamp、inRange、max、maxBy、median、min、minBy、percentile、range、sum等。maxBy专用于这样的场景要比较的BigInt值嵌套在对象内部而你希望返回的是整个对象而不只是数值本身。按照 官方文档 的说明该函数只能从es-toolkit/bigint导入这样做是为了避免与其他数值类型如Number版maxBy产生命名冲突import { maxBy } from es-toolkit/bigint;这一点在 package.json 的exports字段中有明确体现./bigint: ./src/bigint/index.ts是独立的子路径入口与./array、./math、./compat等并列。基本用法从账户列表中找出余额最大的账户maxBy接收两个参数待搜索的元素数组以及一个把每个元素映射为BigInt的取值函数。下面是最典型的应用——从一组账户对象中找出余额balanceBigInt类型最大的账户import { maxBy } from es-toolkit/bigint; const accounts [ { owner: alice, balance: 10n }, { owner: bob, balance: 30n }, { owner: carol, balance: 20n }, ]; const richest maxBy(accounts, account account.balance); console.log(richest); // { owner: bob, balance: 30n }getValue只负责“取值”比较与返回都由maxBy完成它遍历数组用映射出的BigInt进行比较最终返回拥有最大派生值的那一个原始元素这里是{ owner: bob, balance: 30n }整个对象。平局处理多个最大值并列时返回第一个当多个元素的派生BigInt值并列最大时maxBy返回第一个遇到的元素这一点在 文档 和 测试用例 中均有明确说明import { maxBy } from es-toolkit/bigint; const first { id: a, score: 30n }; const second { id: b, score: 30n }; console.log(maxBy([first, second], item item.score)); // { id: a, score: 30n }测试中使用了toBe(first)进行引用相等性断言确认返回的是原数组中的第一个元素本身而非副本。取值函数的三参签名元素、索引、整个数组getValue的完整签名为(element: T, index: number, array: readonly T[]) bigint。也就是说除了元素本身它还能拿到当前索引和整个数组可用于构造依赖位置的比较值import { maxBy } from es-toolkit/bigint; // 用「元素值与位置」共同派生的值进行比较 const rounds [{ points: 5n }, { points: 5n }, { points: 5n }]; const best maxBy(rounds, (round, index) round.points * BigInt(index 1)); console.log(best); // 第三个 round因为它的乘数最大单元测试 对三参传递行为做了直接验证它记录每次调用收到的(element, index, array)并断言调用序列为[a, 0, items] [b, 1, items] [c, 2, items]这说明maxBy对数组中的每个元素恰好调用一次getValue且索引从 0 开始递增。空数组抛出RangeError如果数组为空没有任何元素可以返回maxBy会抛出RangeError错误信息为Cannot find the maximum of an empty array.import { maxBy } from es-toolkit/bigint; maxBy([], () 0n); // RangeError: Cannot find the maximum of an empty array.这是设计上的一处重要取舍与 lodash 兼容版maxBy空数组返回undefined见下文不同BigInt.maxBy选择用异常来暴露“空数组没有最大值”这一逻辑矛盾避免静默返回undefined造成后续隐式错误。参数与返回值速查项目说明itemsreadonly T[]待搜索的元素数组getValue(element: T, index: number, array: readonly T[]) bigint返回用于比较的BigInt的函数返回值T派生BigInt最大的那个元素并列时返回第一个异常数组为空时抛出RangeError: Cannot find the maximum of an empty array.源码实现原理src/bigint/maxBy.ts 的实现非常精简核心逻辑如下export function maxByT(items: readonly T[], getValue: (element: T, index: number, array: readonly T[]) bigint): T { if (items.length 0) { throw new RangeError(Cannot find the maximum of an empty array.); } let maxElement items[0]; let max getValue(items[0], 0, items); for (let i 1; i items.length; i) { const element items[i]; const value getValue(element, i, items); if (value max) { max value; maxElement element; } } return maxElement; }可以提炼出三条实现事实单次线性遍历O(n) 时间复杂度从第 1 个元素开始迭代索引 0 已在初始化时处理每个元素只调用一次getValue不产生中间映射数组内存开销恒定。严格大于才更新value max使用严格比较因此并列最大值不会覆盖已记录的首个元素——这正是“平局返回第一个”这一行为的底层原因。空数组前置检查在初始化maxElement之前就抛出RangeError避免在空数组上访问items[0]。与同族函数的对比max数组本身就是BigInt时如果数组元素直接就是BigInt而非对象应使用 src/bigint/max.ts 中的max它不需要取值函数import { max } from es-toolkit/bigint; const huge max([9007199254740993n, 9007199254740992n]); // 9007199254740993n这是 Math.max 无法区分的数值max与maxBy在空数组行为上保持一致同样抛出RangeError两者的文档注释也互相呼应。minBy求最小值时src/bigint/minBy.ts 的minBy与maxBy结构完全对称同样对空数组抛错错误信息为Cannot find the minimum of an empty array.同样平局返回第一个只是把value max换成value min。如果你在“找最大”与“找最小”之间切换只需替换函数名参数约定完全一致。lodash 兼容版maxBy行为差异es-toolkit 在es-toolkit/compat下提供了 lodash 兼容的 src/compat/math/maxBy.ts它与BigInt.maxBy存在显著差异选型时务必区分导入路径不同兼容版从es-toolkit/compat导入面向 lodash 迁移场景BigInt.maxBy仅从es-toolkit/bigint导入。iteratee 形式更灵活兼容版接受函数、字符串键名、[key, value]对或匹配对象默认identity。空数组与空值处理不同兼容版对空数组返回undefined对null/undefined输入直接返回undefinedBigInt.maxBy则对空数组抛出RangeError且要求输入必须是数组。返回值类型不同兼容版返回T | undefinedBigInt.maxBy返回T。从源码结构看兼容版还内置了对NaN、symbol、null等特殊比较值的跳过逻辑而BigInt.maxBy面向纯BigInt比较语义更简单直接。测试验证src/bigint/maxBy.spec.ts 用 4 组测试覆盖了全部关键行为返回映射值最大的元素余额 30n 的账户并列时返回第一个元素toBe引用断言getValue收到元素、索引、数组三个参数且每个元素恰好调用一次空数组抛出RangeError。你可以通过仓库根目录的测试命令验证yarn test运行vitest --coverage见 package.json 的test脚本。总结es-toolkit/bigint的maxBy是处理“对象数组 大整数派生值取最大”场景的专用工具单一线性遍历、严格大于才更新保证平局取首、空数组显式抛错。结合max元素本身即BigInt与minBy对称取最小即可覆盖大整数选取的全部需求而需要 lodash 迁移兼容时则应改用es-toolkit/compat下的maxBy并注意其空数组返回undefined的语义差异。【免费下载链接】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),仅供参考