es-toolkit/fp minBy 函数式指南:在 pipe 管道中筛选最小元素
es-toolkit/fp minBy 函数式指南在 pipe 管道中筛选最小元素【免费下载链接】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-toolkitminBy是 es-toolkit 函数式入口es-toolkit/fp提供的管道操作符它接收一个取值函数getValue返回一个等待数据的函数在pipe管道中对数组逐元素求值并返回得分最小的那个元素。本文以 docs/fp/reference/minBy.md 为骨架结合 src/fp/array/minBy.ts、src/array/minBy.ts 及对应测试讲解它的用法、签名、边界行为与底层实现读完即可在数据管道中熟练使用minBy选取最小项。minBy 是什么minBy的函数式变体不直接接收数组而是采用data-last数据最后的柯里化形态先传入配置参数getValue返回一个接收数组并返回最小元素的函数。这个返回的函数正是pipe管道所期望的操作符形态因此它天然适合与pipe组合使用const result pipe(array, minBy(getValue));文档明确建议普通代码优先使用 es-toolkit 原始的minBy只有当你用pipe组合多个变换时才使用这个 fp 变体。这是es-toolkit/fp模块的通用设计——它复用es-toolkit的实现只改变调用方式详见 docs/fp/intro.md。基本用法在管道中使用时minBy会为数组中的每个值调用getValue返回计算结果最小的那个值若数组为空则返回undefined。import { minBy, pipe } from es-toolkit/fp; pipe( [{ score: 10 }, { score: 30 }, { score: 20 }], minBy(item item.score) ); // { score: 10 }es-toolkit/fp的入口src/fp/index.ts统一从./array/index.ts导出所有数组操作符而minBy正是通过 src/fp/array/index.ts 中的export { minBy } from ./minBy.ts暴露的。对应的单元测试 src/fp/array/minBy.spec.ts 验证了它在管道中的行为对[{ score: 1 }, { score: 3 }, { score: 2 }]执行minBy(item item.score)得到{ score: 1 }。参数与返回值参数getValue(item: T) number—— 返回用于比较的数值的函数。返回值(array: readonly T[]) T | undefined—— 一个将readonly T[]映射为最小元素的函数数组为空时返回undefined。类型签名与重载从 src/fp/array/minBy.ts 可以看到fp 变体提供了两组重载用于在类型层面区分空数组与非空数组非空元组重载输入readonly [T, ...T[]]至少一个元素返回T普通数组重载输入readonly T[]返回T | undefined。export function minByT( getValue: (element: T, index: number, array: readonly T[]) number ): (array: readonly [T, ...T[]]) T; export function minByT( getValue: (element: T, index: number, array: readonly T[]) number ): (array: readonly T[]) T | undefined;值得注意的是尽管文档简化了getValue的类型为(item: T) number源码中完整签名还提供索引与数组两个附加参数(element: T, index: number, array: readonly T[]) number。这意味着你可以在取值函数中利用下标或整个数组参与计算详见下文与原始 minBy 的关系一节中的例子。fp 变体的实现非常轻量——它仅仅把getValue闭包捕获返回一个新函数内部直接委托给 es-toolkit 原始实现minByToolkit(array, getValue)src/fp/array/minBy.tsexport function minByT( getValue: (element: T, index: number, array: readonly T[]) number ): (array: readonly T[]) T | undefined { return function (array: readonly T[]): T | undefined { return minByToolkit(array, getValue); }; }这也印证了 docs/fp/intro.md 中es-toolkit/fp复用es-toolkit的实现的描述fp 变体只改变调用方式不重复实现算法。与原始 minBy 的关系fp 变体与原始minBy共享完全相同的底层算法src/array/minBy.ts数组为空时直接返回undefined初始化minElement为首元素、min Infinity遍历数组对每个元素调用getValue(element, i, items)求值若求值结果为NaN立即返回产生该值的元素与Math.min的 NaN 传播行为一致若value min更新min与minElement。两种形态唯一的区别是参数顺序与柯里化方式形态导入路径调用方式原始minByes-toolkit或es-toolkit/arrayminBy(items, getValue)fp 变体es-toolkit/fppipe(array, minBy(getValue))原始版本还支持在getValue中使用索引与数组参数这一点已被测试覆盖src/array/minBy.spec.tsimport { minBy } from es-toolkit/array; const items [{ value: 10 }, { value: 20 }, { value: 15 }]; // 使用 index 参数 minBy(items, (item, index) item.value index); // Returns: { value: 10 } // 使用 array 参数 minBy(items, (item, _index, array) item.value * array.length); // Returns: { value: 10 }fp 变体同样透传这些附加参数因此上述两种用法在pipe管道中同样成立。边界行为minBy的边界行为有测试用例与源码双重佐证src/array/minBy.spec.ts空数组返回undefined由items.length 0分支直接处理src/array/minBy.ts。并列最小值取第一次出现首个最小元素因为比较条件使用严格小于value min后续相等的元素不会覆盖minElement。测试if there are two min values, first one is selected验证了这一点。单元素数组直接返回唯一元素。NaN 传播只要任意元素的求值结果为NaN无论其位置在数组头部、中间还是尾部都返回产生NaN的那个元素与Math.min的行为一致测试覆盖了 NaN 在三个不同位置的场景src/array/minBy.spec.ts。实战在管道中组合 minByminBy的典型价值在于与pipe中其他操作符自由组合。得益于pipe的**惰性求值lazy evaluation**机制——连续的可惰性函数如map、filter、take会被融合为单趟遍历不再为每个步骤构建中间数组详见 docs/fp/reference/pipe.md 与 src/fp/pipe.ts——管道既清晰又高效import { pipe, map, filter, minBy } from es-toolkit/fp; const orders [ { id: 1, items: 3, price: 40 }, { id: 2, items: 5, price: 25 }, { id: 3, items: 1, price: 100 }, ]; // 过滤、变换、取最小一气呵成 const cheapestOrder pipe( orders, filter(o o.items 1), // 先过滤 map(o ({ ...o, total: o.items * o.price })), // 再计算总额 minBy(o o.total) // 最后取总额最小的订单 ); // { id: 2, items: 5, price: 25, total: 125 }任何一元函数都可以放入pipe因此你甚至可以在管道中直接内联minBy所需的取值逻辑import { pipe, minBy } from es-toolkit/fp; pipe( [-10, -5, 0, 5, 15], minBy(x Math.abs(x)) ); // 0总结什么时候用在pipe管道中需要按某个得分取最小元素时使用minBy(getValue)普通直接调用场景请改用minByminBy(items, getValue)。返回值语义返回得分最小的原始元素空数组返回undefined并列取首个NaN立即短路并返回产生NaN的元素。实现本质fp 变体是原始minBy的 contenteditable="false">【免费下载链接】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),仅供参考