news 2026/9/16 14:45:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
es-toolkit 函数式编程:用 `pipe` 组合 `takeRightWhile` 从数组尾部按条件截取元素

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

【免费下载链接】es-toolkitA modern JavaScript utility library that's 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 > 23 > 2均通过;轮到2时不满足条件,扫描停止,最终得到[3, 4]

pipe本身在 src/fp/pipe.ts 中实现为从左到右的函数组合,它把value依次穿过每个函数并传递结果;若中途出现连续的惰性(lazy)函数(如mapfiltertake),pipe还会将其融合成单次遍历以减少中间数组分配(详见 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 takeRightWhile<T>( 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.ts:

export function takeRightWhile<T>( 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(); }

这段实现有三个值得注意的工程细节:

  1. 扫描方向:循环从arr.length - 1递减到0,即从尾部向前逐元素调用谓词,与“取后缀”的语义完全对应。
  2. 提前终止:遇到第一个失败元素立即用arr.slice(i + 1)返回,绝不会继续扫描更靠前的元素——这就是它比“过滤后取尾部”更高效的原因(线性扫描 O(n),且命中即停)。
  3. 全部通过时的处理:若整个数组都满足条件,返回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]——从尾部检查,只有下标34满足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'),并支持ArrayLike<T> | null | undefined输入。如果你在从 Lodash 迁移、需要保留既有调用点,应选用 compat 版本;在pipe中组合变换时,才使用本文介绍的 fp 版本。

小结

es-toolkit/fptakeRightWhile是一个职责单一、实现轻量的数据流操作符:接受谓词、返回“数组 → 数组”的函数,从尾部扫描并在首个失败元素处截断。理解它的三个要点即可上手:从右向左的单趟扫描、命中即停的提前返回、全部通过时返回浅拷贝。配合pipe阅读顺序与数据流方向一致,你可以把“清理尾部噪声数据”“提取日志末尾满足条件的记录”这类需求,写成清晰可读的声明式管线。

【免费下载链接】es-toolkitA modern JavaScript utility library that's 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 14:41:00

STM32电子血压计实现:示波法、脉搏波提取与ADC采样全解析

简介&#xff1a;基于STM32设计的电子血压计完整项目包&#xff0c;面向嵌入式方向的学生与开发者&#xff0c;适用于课程设计、毕业设计、工程实训及学科竞赛等场景。资源已经过严格测试可直接运行&#xff0c;包含完整源码、工程文件及使用说明&#xff0c;可帮助快速复刻血压…

作者头像 李华
网站建设 2026/9/16 14:39:58

SpringBoot+MyBatis打造新生报到系统:从数据库设计到并发兜底

简介&#xff1a;SpringBoot大学新生报到系统是一份面向计算机专业毕业设计及Spring Boot实战学习的完整工程源码包&#xff0c;覆盖学生信息管理、报到流程管理和宿舍分配等核心模块。压缩包共561个文件&#xff0c;约16.02MB&#xff0c;其中包含123个Java源码、93个Vue页面、…

作者头像 李华
网站建设 2026/9/16 14:38:57

多源医学数据采集实战:统一JSON结构设计与Python爬虫工程化

简介&#xff1a;一套使用Python实现的医学知识采集与爬虫源码&#xff0c;整合知网、掌上高考、上海体检套餐、39net检查、薄荷网等数据源&#xff0c;将爬取的疾病、症状、医生、机构、处方等多类信息统一保存为JSON文件&#xff0c;适合研究多源爬虫与医学数据处理的Python开…

作者头像 李华
网站建设 2026/9/16 14:38:00

Android财务系统毕业设计:登录、账单与统计全模块解析

简介&#xff1a;面向毕业设计场景的Android财务系统完整项目资源包&#xff0c;适合计算机相关专业学生与需要快速搭建财务类App的开发者。资源共1226个文件&#xff0c;压缩包仅10.86MB&#xff0c;以Java源码、XML布局、PNG图片、JAR依赖库等类型为主&#xff0c;包含完整的…

作者头像 李华