ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

es-toolkit 函数式编程:用 `pipe` 组合 `takeRightWhile` 从数组尾部按条件截取元素

es-toolkit 函数式编程:用 `pipe` 组合 `takeRightWhile` 从数组尾部按条件截取元素 es-toolkit 函数式编程用pipe组合takeRightWhile从数组尾部按条件截取元素【免费下载链接】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本文聚焦 es-toolkit 函数式编程入口es-toolkit/fp中的takeRightWhile它是一种“数据在后”data-last风格的操作符专为配合pipe从左到右的数据流水线而设计。读完本文你将掌握它的签名、运行机制、边界行为并能在自己的变换管线中熟练使用它截取满足条件的尾部元素。功能概述从尾部持续取值直到条件失败takeRightWhile从数组的末尾开始向前遍历只要谓词函数predicate返回true就持续收集元素一旦遇到第一个不满足条件的元素立即停止返回收集到的这段尾部切片。与takeWhile从头开始取值相反它处理的是“后缀”suffix而不是“前缀”prefix。在普通代码中官方推荐直接使用 es-toolkit 常规版本的takeRightWhile而fp变体的价值在于组合变换——当你正在用pipe组织一条数据流时用它作为其中一个步骤。在pipe中使用es-toolkit/fp的每个函数都采用“先传配置、后传数据”的调用方式takeRightWhile(predicate)先返回一个等待数据的函数再由pipe把上游结果喂给它。import { pipe, takeRightWhile } from es-toolkit/fp; pipe( [1, 2, 3, 4], takeRightWhile(value value 2) ); // [3, 4]数据流是自顶向下阅读的数组[1, 2, 3, 4]进入takeRightWhile从尾部4开始4 2、3 2均通过轮到2时不满足条件扫描停止最终得到[3, 4]。pipe本身在 src/fp/pipe.ts 中实现为从左到右的函数组合它把value依次穿过每个函数并传递结果若中途出现连续的惰性lazy函数如map、filter、takepipe还会将其融合成单次遍历以减少中间数组分配详见 docs/fp/intro.md。参数参数类型说明predicate(item: T, index: number, array: readonly T[]) boolean决定某个尾部元素是否被保留的判定函数注意虽然 fp 文档的简写签名为(item: T) boolean实际实现中谓词还接收当前下标和完整输入数组两个额外参数见 src/fp/array/takeRightWhile.ts这使你可以写出依赖位置的判定逻辑。返回值(array: readonly T[]) T[]—— 一个将readonly T[]映射为通过判定的尾部元素数组的函数。它接受只读数组输入返回全新的数组结果不会修改原数组。底层实现一次从右向左的线性扫描fp变体本身极薄——它只是把数据参数前置、再转调常规实现// src/fp/array/takeRightWhile.ts export function takeRightWhileT( predicate: (element: T, index: number, array: readonly T[]) boolean ): (array: readonly T[]) T[] { return function (array: readonly T[]): T[] { return takeRightWhileToolkit(array, predicate); }; }真正干活的是常规版本的 src/array/takeRightWhile.tsexport function takeRightWhileT( arr: readonly T[], shouldContinueTaking: (item: T, index: number, array: readonly T[]) boolean ): T[] { for (let i arr.length - 1; i 0; i--) { if (!shouldContinueTaking(arr[i], i, arr)) { return arr.slice(i 1); } } return arr.slice(); }这段实现有三个值得注意的工程细节扫描方向循环从arr.length - 1递减到0即从尾部向前逐元素调用谓词与“取后缀”的语义完全对应。提前终止遇到第一个失败元素立即用arr.slice(i 1)返回绝不会继续扫描更靠前的元素——这就是它比“过滤后取尾部”更高效的原因线性扫描 O(n)且命中即停。全部通过时的处理若整个数组都满足条件返回arr.slice()即一个与原数组等长的浅拷贝保证调用方持有的新数组与原数组互不影响。由于该函数不携带.lazy标记pipe会把它归入普通非惰性函数组走逐函数应用的 eager 路径见 src/fp/pipe.ts 的分组逻辑——也就是说takeRightWhile不会参与惰性融合但它本身已是单趟扫描开销可控。边界行为与测试验证仓库中的测试用例 src/array/takeRightWhile.spec.ts 完整覆盖了各类边界场景输入谓词结果[5, 4, 3, 2, 1]n n 4[3, 2, 1][1, 2, 3]n n 3[]首个被检查的元素即失败[1, 2, 3, 4, 5]n n 2[3, 4, 5][1, 2, 3, 4, 5]n n 6[1, 2, 3, 4, 5]全部通过返回拷贝[]任意[]空数组安全处理此外还有两个关于谓词额外参数的用例下标参数takeRightWhile([10, 20, 30, 40, 50], (_, index) index 2)返回[40, 50]——从尾部检查只有下标3、4满足index 2。数组参数takeRightWhile([1, 2, 3, 4], (value, index, array) value array.length / 2)返回[2, 3, 4]说明判定可以依赖整个数组的上下文。fp 变体自身的单测 src/fp/array/takeRightWhile.spec.ts 则验证了它在pipe中的行为pipe([1, 2, 3, 4], takeRightWhile(value value 2))等于[3, 4]。该函数已从 src/fp/array/index.ts 导出可直接通过import { takeRightWhile } from es-toolkit/fp引入。与常规版本及 compat 版本的取舍es-toolkit/array常规版参数顺序为“数据在前”即takeRightWhile(arr, shouldContinueTaking)适合直接调用详见 docs/reference/array/takeRightWhile.md。fp 版只是把数据移到最后一个参数底层复用同一实现。es-toolkit/compat兼容版位于 src/compat/array/takeRightWhile.ts完全对齐 Lodash 的调用约定——谓词可省略默认取真值、可传函数、对象{ user: pebbles, active: false }、键值对数组[active, false]或属性名字符串active并支持ArrayLikeT | null | undefined输入。如果你在从 Lodash 迁移、需要保留既有调用点应选用 compat 版本在pipe中组合变换时才使用本文介绍的 fp 版本。小结es-toolkit/fp的takeRightWhile是一个职责单一、实现轻量的数据流操作符接受谓词、返回“数组 → 数组”的函数从尾部扫描并在首个失败元素处截断。理解它的三个要点即可上手从右向左的单趟扫描、命中即停的提前返回、全部通过时返回浅拷贝。配合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-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表