ARTICLE DETAIL

资讯详情

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

es-toolkit/fp 函数式 pick 详解:用 pipe 组合对象字段提取

es-toolkit/fp 函数式 pick 详解:用 pipe 组合对象字段提取 es-toolkit/fp 函数式 pick 详解用 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-toolkitpickFP 变体是 es-toolkit 函数式编程入口 es-toolkit/fp 提供的对象工具之一它把“从对象中挑出指定键”这一操作转换为一个等待数据传入的函数从而可以无缝嵌入pipe管道。读完本文你将掌握 fp 版pick的完整签名与用法、它与普通版pick的取舍原则以及它在源码与测试中体现的底层行为细节。什么是 fp 版pick函数式编程FP风格强调数据最后传入data-last调用函数时先传入配置参数返回一个接收实际数据的新函数。es-toolkit/fp 介绍 明确说明es-toolkit/fp的每个函数都通过配置参数如map(fn)、take(2)调用并返回一个以数据为参数的函数由pipe负责供给数据、逐级传递结果。fp 版pick正是这一模式的对象操作示例它接收一个键数组keys返回(obj) PickT, K形式的函数专门用于与pipe组合const result pipe(obj, pick(keys));其核心语义与普通版一致返回一个仅包含输入对象中指定键的新对象输入上不存在的键会被跳过。基本用法在 pipe 中挑选字段最典型的场景是数据流经管道时在某一环节只保留需要的字段import { pick, pipe } from es-toolkit/fp; pipe({ a: 1, b: 2, c: 3 }, pick([a, c])); // { a: 1, c: 3 }由于 fp 版pick返回的是尚未接收数据的函数它可以和任意一元函数一样直接放在pipe的任意位置与filter、map、take等步骤自由组合。例如先挑选字段、再继续变换import { map, pick, pipe } from es-toolkit/fp; pipe( [{ id: 1, name: alice, secret: x }, { id: 2, name: bob, secret: y }], map(pick([id, name])) // 每个元素都只保留 id 与 name ); // [{ id: 1, name: alice }, { id: 2, name: bob }]关于pipe的求值细节——当连续的惰性函数map、filter、take等组合时pipe会将它们融合为单趟遍历避免每一步都构建中间数组并可被末尾的take提前终止——可参考 pipe 参考文档 与 src/fp/pipe.ts 的实现。参数与返回值原文档给出了精确的类型签名项目签名说明参数keysreadonly K[]要复制到新对象的键集合K是对象T的键的子集返回值(obj: T) PickT, K一个将对象T映射为仅含所选键的新对象的函数类型约束上K extends keyof T意味着编译期就能检查出你挑选的键必须是输入对象实际拥有的键这比运行时才发现问题要安全得多。从源码看完整的泛型签名为pickT extends Recordstring, any, K extends keyof T(keys: readonly K[]): (obj: T) PickT, K见 src/fp/object/pick.ts其中T被约束为Recordstring, any形式的对象。源码剖析fp 变体如何复用普通实现fp 版pick的实现非常简洁——它本身不重复实现挑选逻辑而是直接复用了 es-toolkit 普通版pick仅改变了调用形态// src/fp/object/pick.ts import { pick as pickToolkit } from ../../object/pick.ts; export function pickT extends Recordstring, any, K extends keyof T(keys: readonly K[]): (obj: T) PickT, K { return function (obj: T): PickT, K { return pickToolkit(obj, keys); }; }这印证了 docs/fp/intro.md 中“es-toolkit/fp复用es-toolkit的实现只改变调用方式”的架构原则——FP 层是普通 API 之上的薄封装。真正的挑选逻辑位于 src/object/pick.ts它遍历键数组用Object.hasOwn(obj, key)做自有属性检查只有对象自身拥有的键才会被复制到结果对象中export function pickT extends Recordstring, any, K extends keyof T(obj: T, keys: readonly K[]): PickT, K { const result {} as PickT, K; for (let i 0; i keys.length; i) { const key keys[i]; if (Object.hasOwn(obj, key)) { result[key] obj[key]; } } return result; }几个值得注意的实现细节Object.hasOwn保证不复制继承属性即使原型链上存在同名属性也不会被挑选进来结果对象只包含目标对象自身的可枚举自有属性。每次调用都会新建对象pick返回的是全新的普通对象原对象不会被修改符合纯函数语义这也是它能安全用于pipe管道的前提。键的遍历顺序结果对象的属性顺序与keys数组中键的出现顺序一致在常规属性场景下。行为边界由测试用例验证仓库中的测试用例src/fp/object/pick.spec.ts 与 src/object/pick.spec.ts用断言固化了pick的行为边界可直接作为使用时的参考只保留被挑选的键pipe({ a: 1, b: 2, c: 3 }, pick([a, c]))结果为{ a: 1, c: 3 }。跳过对象上不存在的键pipe({ a: 1, b: 2 } as { a: number; b: number; c?: number }, pick([a, c]))结果为{ a: 1 }c被静默忽略。空键数组返回空对象pipe({ a: 1, b: 2 }, pick([]))结果为{}。挑选全部键时返回等价对象普通版测试验证了pick(obj, [a, b, c])的结果与输入对象toEqual。嵌套对象被挑选的键对应的值如果是嵌套对象会原样保留引用浅拷贝语义例如{ b: { nested: pick } }中的嵌套对象不会被深拷贝。不存在的键不会产生新属性普通版测试通过Reflect.ownKeys(result)断言输入对象没有该键时结果对象也不会凭空多出这个属性。这些测试覆盖了“键缺失”“键为空”“浅拷贝”三类最容易踩坑的场景使用前值得通读一遍。何时用 fp 版、何时用普通版原文档给出了明确的选型建议见 docs/fp/reference/pick.md 中的提示块普通业务代码中优先使用 es-toolkit 的普通版pick即pick(obj, keys)的直接调用形态当你在用pipe组合数据变换流程时才改用本 fp 变体以获得自上而下、可读性更好的管道式写法。换句话说fp 版pick不是普通版的替代品而是管道场景下的配套工具。这种“普通 API 为主、FP 变体为辅”的双轨设计贯穿整个es-toolkit/fp模块。延伸阅读pipeFP 函数组合入口pick的典型搭配介绍管道与惰性求值机制es-toolkit/fp 总览FP 模块的设计理念、惰性融合与性能取舍普通版 pick对象操作直接调用形态的完整参考实现与测试src/fp/object/pick.ts、src/object/pick.ts、src/fp/object/pick.spec.ts、src/object/pick.spec.ts【免费下载链接】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),仅供参考
返回列表