资讯动态

Remeda 迁移指南:用 filter + isTruthy 替代 Lodash compact 去除数组假值

发布时间:2026/10/13 3:12:33 来源:尧图企业网站定制
开发工具【免费下载链接】remedaA utility library for JavaScript and TypeScript.项目地址https://gitcode.com/gh_mirrors/re/remeda点击查看免费下载Lodash 的compact用于剔除数组中的假值falsy元素而 Remeda 并未提供同名函数而是推荐用更基础的filter配合类型守卫isTruthy组合实现。本文基于 Remeda 官方迁移映射文档与源码实现完整讲解这一迁移方案的数据优先data-first与数据置后data-last两种写法并深入剖析isTruthy的类型收窄能力与filter的懒执行机制帮助你在迁移到 Remeda 后写出类型更安全、性能更优的等价代码。迁移映射compact的 Remeda 等价写法在 Remeda 文档站的迁移映射体系中compact.md 记录了 Lodashcompact与 Remeda 函数的一一对应关系。该文件的 frontmatter 明确标注了分类与目标函数--- category: Array remeda: filter ---即Lodashcompact属于 Array 分类其 Remeda 替代者是filter。正文给出的迁移规则只有一句话——以isTruthy作为谓词predicate// Lodash compact(DATA); // Remeda filter(DATA, isTruthy);这一组合替换并非 Remeda 首创的临时方案而是与原生 JavaScript 语义对齐的惯用写法compact的本质就是保留所有真值、剔除所有假值用通用过滤函数加上真值判定谓词即可精确复现。为什么不再提供独立的compactv1 迁移背景Remeda 并非一直都没有compact。在 v1 版本中它曾作为独立函数存在但在 v2 中被移除。官方迁移文档 migration-removed.md 给出了明确理由To offer the best possible functions, we deemed several functions as redundant when they could be easily replaced with other existing functions, resulting in code of the same length.即当某个函数能被其他既有函数以相同长度的代码轻松替换时它就被视为冗余。compact正是首批被移除的函数之一与其同批移除的还有countBy、flattenDeep、reject、zipObj等。对应的 v1→v2 迁移条目 compact.md 给出了完整的迁移对照// Was compact([1, null, 3]); // Now filter([1, null, 3], isTruthy);// Was pipe([1, null, 3], compact); // Now pipe([1, null, 3], filter(isTruthy));可以看到无论是独立调用还是放入pipe管道替换代码的行数都与原写法持平这正是 Remeda 移除该函数的判断标准——不增加使用成本还能减少 API 面、提升复用性。isTruthy带类型收窄的真值守卫替换方案的核心是isTruthy。它的实现位于 isTruthy.tsexport function isTruthyT( data: T, ): data is ExcludeT, | 0 | false | null | undefined { return Boolean(data); }其运行时的判定逻辑非常简单直接返回Boolean(data)。但它的类型签名是 Remeda 相比 Lodash 的最大优势——它是一个TypeScript 类型守卫type predicate返回类型被收窄为排除了 | 0 | false | null | undefined后的联合类型。这意味着什么以 Lodash 的compact为例其 TypeScript 类型定义_.compactT(array: ListT | null | undefined | false | | 0): T[]不会对返回数组的元素类型做任何收窄null、undefined等类型信息在过滤后依然可能残留。而 Remeda 的写法会在类型层面同步过滤import { filter, isTruthy } from remeda; const data: (string | null | undefined | 0 | false)[] [a, null, 0, b, false]; const result filter(data, isTruthy); // const result: string[]类型守卫的验证由类型测试文件 isTruthy.test-d.ts 覆盖其中 | 0 | false | { a: string }类型的联合在通过isTruthy判断后被精确收窄为{ a: string }。这正是迁移到 Remeda 后代码更安全的直接证据运行时的过滤与编译期的类型收窄同步发生。filter的双签名调用data-first 与>//>export function filter(...args: readonly unknown[]): unknown { return purry(filterImplementation, args, lazyImplementation); }它通过 Remeda 内部的purry机制见 purry.ts根据参数个数自动分发参数个数与实现函数一致时直接调用filterImplementation底层就是原生data.filter(predicate)少一个参数即传入的是谓词时则进入>const counter vi.fn(x: number) number(identity()); const result pipe( [1, 2, 3], filter((x) x % 2 1), map(counter), ); expect(counter).toHaveBeenCalledTimes(2);输入数组有 3 个元素但filter之后map的计数器只被调用了2 次——因为懒执行让map只处理了过滤后剩下的 2 个奇数元素。对比 Lodash 的compact只做整数组一次过滤的静态语义Remeda 的filter在管道中具备流水线式的惰性求值能力这在多步变换的长管道中能显著减少无效计算。其懒实现定义在同一个文件中const lazyImplementation T( predicate: (value: T, index: number, data: readonly T[]) boolean, ): LazyEvaluatorT (value, index, data) predicate(value, index, data) ? { done: false, hasNext: true, next: value } : SKIP_ITEM;元素通过谓词判定时被原样放行hasNext: true, next: value未通过时返回SKIP_ITEM单例定义于 utilityEvaluators.ts指示跳过实现非常轻量。迁移映射文档的生成机制供文档维护者参考如果你在维护 Remeda 文档站会注意到compact.md只是众多迁移映射文件之一。整个映射体系存放在 packages/docs/src/content/mapping/lodash 目录下每个 Lodash 函数对应一个 Markdown 文件。这些文件由 content.config.ts 以glob方式加载schema 仅要求两个字段schema: z .object({ category: z.string().min(1), remeda: reference(functionsCollectionName).optional(), }) .strict() .readonly(),随后由 mapping-function-card.astro 渲染为迁移卡片卡片头部显示compact名称、Array分类徽章和跳转到 Lodash 官方文档的链接URL 模板见 urls.ts正文渲染Use isTruthy as the predicate与代码示例并链接到对应的 Remeda 函数filter文档。这意味着每一份迁移映射都是可验证、可追溯的——文档中的替换规则与仓库源码一一对应。实战要点小结将 Lodashcompact迁移到 Remeda 时只需记住三个要点标准替换compact(DATA)写作filter(DATA, isTruthy)在pipe中写作pipe(DATA, filter(isTruthy))。类型红利isTruthy是类型守卫替换后数组元素类型会被自动收窄剔除、0、false、null、undefined这是 Lodashcompact不具备的编译期保障。管道性能filter支持懒执行置于pipe管道中时后续函数只会处理通过过滤的元素适合与map等函数链式组合。如需进一步查阅实现细节可深入阅读 filter.ts、isTruthy.ts、filter.test.ts 与迁移文档 compact.md。赞分享开发工具【免费下载链接】remedaA utility library for JavaScript and TypeScript.项目地址https://gitcode.com/gh_mirrors/re/remeda点击查看免费下载相关推荐Remeda 迁移指南用 partialLastBind 替代 Lodash _.partialRightRemeda 迁移指南用 partialLastBind 替代 Lodash _.partialRight 导读 Lodash 的 _.partialRigh开发工具Remeda 迁移指南用 toLowerCase(toTitleCase(...)) 替代 Lodash lowerCaseRemeda 迁移指南用 toLowerCase toTitleCase ... 替代 Lodash lowerCase 本文聚焦于 Remeda 官方迁移文开发工具Remeda 迁移实战用 zip fromEntries 组合替代 Lodash 的 zipObjectRemeda 迁移实战用 zip fromEntries 组合替代 Lodash 的 zipObject 本篇指南围绕 zipObject 迁移对照文档开发工具上一篇CodexManager聚合API配置指南第三方中转站如何与账号池混合兜底路由下一篇GitAgent工作流与SkillFlows教程可视化编排带审批门的多步AI任务流创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑