尧图精选

es-toolkit 兼容版 pick:lodash 风格的对象属性筛选与深路径选择

🕒 发布时间:2026/9/15 18:45:08 📁 来源:尧图网络
es-toolkit 兼容版 picklodash 风格的对象属性筛选与深路径选择【免费下载链接】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 的 lodash 兼容版pick函数从es-toolkit/compat导入它用于从一个对象中挑选指定属性并生成新对象完整复刻 lodash 行为支持数组/可变参数两种传参方式、点号深路径、路径数组、Symbol 键、继承属性等。文章将以 兼容版 pick 官方文档 为主线结合 compat 实现源码、单元测试 以及 get、set、has 底层实现说明其调用链与边界行为并对比 es-toolkit 原生 pick 的性能取舍帮你根据场景选对 API。何时选择 compat 版 pickes-toolkit 同时提供两套pick现代版从es-toolkit/object或es-toolkit导入文档见这里只接受单一数组形式的 key 列表实现极简性能最好。兼容版从es-toolkit/compat导入本文主角行为对齐 lodash支持深路径与多种传参方式。官方文档在开头给出了明确警告见 docs/compat/reference/object/pick.md兼容版pick由于复杂的路径处理、调用get/set函数以及处理null/undefined相对较慢。请优先使用 es-toolkit 更快、更现代的pick。也就是说如果你的数据是扁平对象、只用顶层 key优先用现代版 pick只有当你要迁移 lodash 代码、依赖深路径或 lodash 特有的传参习惯时才需要兼容版。两种实现都可以从同一项目的不同入口导入共存使用互不冲突。基本用法函数签名如下const result pick(obj, ...keys);pick(object, ...props)pick接受一个源对象和若干属性键返回只包含这些属性的新对象不会修改原对象。键可以用数组一次性传入也可以逐个作为独立参数传入还支持深路径选择嵌套属性import { pick } from es-toolkit/compat; // 基本用法数组传键 const obj { a: 1, b: 2, c: 3, d: 4 }; const result pick(obj, [a, c]); // Result: { a: 1, c: 3 } // 逐个作为独立参数传入 const result2 pick(obj, a, c); // Result: { a: 1, c: 3 } // 选择深路径 const nested { user: { profile: { name: John, age: 30 }, settings: { theme: dark } }, admin: true, }; const userInfo pick(nested, user.profile.name, admin); // Result: { user: { profile: { name: John } }, admin: true } // 混合数组与单个键 const mixed { a: 1, b: 2, c: 3, d: { e: 4, f: 5 } }; const selected pick(mixed, [a, b], c, d.e); // Result: { a: 1, b: 2, c: 3, d: { e: 4 } }点号键与真实点号键的区分当对象同时存在a.b这样的真实键和{ a: { b: ... } }这样的嵌套结构时lodash 约定真实键优先于深路径解析import { pick } from es-toolkit/compat; const ambiguous { a.b: 1, // 真实键 a.b a: { b: 2, c: 3 }, // 嵌套对象 }; const dotKey pick(ambiguous, a.b); // Result: { a.b: 1 }真实键优先对应测试见 src/compat/object/pick.spec.ts其中还覆盖了{ a: { b: { c: 1 } }, d: { e: 2 }, f: 3, f.g: 4 }这类“深路径与真实点号键并存”的复杂对象以及值为undefined的真实点号键{ a.b: undefined, a: { b: 2 } }选择a.b得到{ a.b: undefined }。null / undefined 处理null或undefined会被当作空对象处理import { pick } from es-toolkit/compat; pick(null, [a, b]); // {} pick(undefined, [a, b]); // {}参数与返回值参数objectT | null | undefined要从中选取属性的源对象。...propsArrayManyPropertyPath要选取的属性键。可以是单个键、键数组也可以是深路径点号字符串或路径数组。类型定义见 src/compat/_internal/Many.ts 与 src/compat/_internal/PropertyPath.tsexport type ManyT T | readonly T[]; export type PropertyPath ManyPropertyKey; // PropertyKey string | number | symbol返回值PickT, U | PartialT返回仅包含指定属性的新对象。源码级原理实现与调用链兼容版 pick 的实现位于 src/compat/object/pick.ts核心流程可以拆成四步空值短路isNil(object)时直接返回{}对应null/undefined空对象语义。键参数归一化flatten遍历keysArr根据每个参数的类型做归一化——字符串/数字/Symbol 包装成单元素数组数组原样保留类数组对象如arguments用Array.from转换其他对象视为单个键。这就是混合数组与单个键能同时工作的原因。取值与存在性判断对每个键先get(object, key)取值若值为undefined且has(object, key)为false跳过该键不存在的键会被忽略对应测试见 src/compat/object/pick.spec.ts。写入结果当 key 是字符串且Object.hasOwn(object, key)为真时直接把源对象属性赋值到结果保证点号真实键优先否则走set(result, key, value)按路径写入从而构造出{ user: { profile: { name: John } } }这样的嵌套结果。这条调用链解释了文档中相对较慢的警告来源每个键都会经过 get内部会做isUnsafeProperty安全检查、isDeepKey判断、必要时toPath转路径数组、has处理稀疏数组/arguments 索引边界以及 set底层委托给updateWith递归建路径相比现代版逐键Object.hasOwn直取的实现确实更重。现代版 pick 的对比参考作为对照es-toolkit 原生 pick 文档 对应的实现只有十几行见 src/object/pick.ts遍历 keys 数组、Object.hasOwn(obj, key)判断、直接赋值。它没有深路径、没有可变参数、不做 null 处理但换来的是最小的体积与最快的速度。选择建议场景推荐 API扁平对象、顶层键、追求性能es-toolkit的pick深路径选择嵌套属性es-toolkit/compat的pick从 lodash 迁移、保持行为一致es-toolkit/compat的pick如果你需要的是“排除指定属性”的反向操作可以查看同目录下的 omit 文档 与 omitBy 文档以及现代版的 omit它们与pick构成完整的对象字段筛选家族。更多边界行为与测试覆盖src/compat/object/pick.spec.ts 用 vitest 覆盖了大量兼容性细节可作为行为契约参考继承属性通过原型链继承的属性可以被选中Foo.prototype object后pick(foo, [a, c])见 测试第 19-26 行。保留0的符号-0与0作为键会分别命中-0与0属性见 测试第 28-36 行。Symbol 键包括不可枚举的 Symbol 属性也能被选中见 测试第 38-66 行。数组对象pick([1, 2, 3], 1)返回{ 1: 2 }。路径数组pick(obj, [[a.b]])等价于选择真实点号键。数字索引深路径pick({ array: [1, 2, 3] }, array[2])得到{ array: [ , , 3] }稀疏数组见 测试第 130-138 行。原始值对象pick(, slice)可以选中字符串原型上的方法。arguments 对象作键集合pick(object, args)中 args 为arguments对象也能正常展开。数字键自动转字符串pick({ 0: a, 1: b }, 0)得到{ 0: a }。这些行为共同保证了从 lodash 迁移时的行为一致性是兼容层存在的意义所在。【免费下载链接】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),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →