ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

es-toolkit/compat 的 mapKeys 完全指南:Lodash 兼容的对象键映射转换

es-toolkit/compat 的 mapKeys 完全指南:Lodash 兼容的对象键映射转换 es-toolkit/compat 的 mapKeys 完全指南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-toolkitmapKeys是 es-toolkit 的 Lodash 兼容层es-toolkit/compat中用于只改键、不改值地重建对象的工具函数。本文基于 docs/ja/compat/reference/object/mapKeys.md 展开结合 compat 实现 与 现代版实现 的源码细节讲解其完整用法、参数约定、iteratee 简写机制与底层原理帮助你安全地从 lodash 迁移并理解兼容层与原生实现之间的差异。mapKeys 是什么mapKeys会遍历对象的每一个自有可枚举字符串键属性将每个键交给iteratee函数生成新键并原样保留对应的值最终返回一个全新的对象。它不会修改传入的原始对象适合用于键名归一化如统一为小写、加前缀、加命名空间或根据值与键的组合生成更语义化的键名。在es-toolkit/compat中它的行为与 lodash 的mapKeys保持一致作为 drop-in replacement 使用const result mapKeys(obj, iteratee);基本用法与典型场景mapKeys的签名与 lodash 一致第一个参数是要转换键的对象或类数组第二个参数是键转换函数iteratee。import { mapKeys } from es-toolkit/compat;给键添加前缀const obj { a: 1, b: 2, c: 3 }; const result mapKeys(obj, (value, key) prefix_ key); // 结果: { prefix_a: 1, prefix_b: 2, prefix_c: 3 }将键转换为大写const data { name: John, age: 30 }; const uppercased mapKeys(data, (value, key) key.toUpperCase()); // 结果: { NAME: John, AGE: 30 }将数组索引转换为键object参数接受ArrayLikeT因此数组也可以直接传入iteratee的第二个参数此时为索引const arr [apple, banana, orange]; const indexed mapKeys(arr, (value, index) item_${index}); // 结果: { item_0: apple, item_1: banana, item_2: orange }组合键与值生成新键const scores { math: 90, science: 85, english: 92 }; const detailed mapKeys(scores, (value, key) ${key}_score_${value}); // 结果: { math_score_90: 90, science_score_85: 85, english_score_92: 92 }null 与 undefined 的边界处理与 lodash 一致当传入null或undefined时mapKeys不会抛错而是将其视为空对象并返回{}import { mapKeys } from es-toolkit/compat; mapKeys(null, iteratee); // {} mapKeys(undefined, iteratee); // {}这一行为在 compat 实现 中有直接体现函数入口处首先执行if (object null) return {};的判空短路该判断覆盖null与undefined两种情况。对应测试见 mapKeys.spec.ts。参数与返回值约定参数参数类型说明objectArrayLikeT \| T \| null \| undefined需要转换键的对象或数组。null/undefined视为空对象iterateeListIterateeT \| ObjectIterateeT可选每个键的转换函数默认值为identity函数原样返回输入即不传时键不变其中iteratee回调的调用约定为(value, key, object)第一个参数是当前属性的值第二个参数是当前键数组场景下为索引第三个参数是原对象。返回值Recordstring, T | Recordstring, T[keyof T]返回一个带转换后键的新对象值保持不变。深入原理compat 实现与 iteratee 简写机制compat 版本的mapKeys是一个非常薄的分发层。其核心逻辑只有两步见 src/compat/object/mapKeys.ts判空object null时直接返回{}委托将对象与经过iteratee()转换后的回调一并交给现代版mapKeys执行。iteratee 简写shorthand机制之所以 compat 版相对较慢正是因为它需要额外的iteratee转换过程这也是原文档警告的原因之一。与 lodash 相同compat 层的iteratee参数并不限于函数还支持多种简写形式由 src/compat/util/iteratee.ts 中的iteratee()工厂函数统一转换函数原样返回直接以(value, key, object)调用属性名字符串如b转换为property(value)即取该属性值作为新键[属性, 值]二元组转换为matchesProperty属性匹配判定部分对象转换为matches对象匹配判定null/undefined/缺省转换为identity即默认保持原键。这一点有明确的测试佐证。在 mapKeys.spec.ts 中mapKeys({ a: { b: c } }, b)会得到{ c: { b: c } }——这里b是属性简写实际取每个值的b属性即c作为新键。测试还验证了当iteratee为null或undefined时使用identity的默认行为见 mapKeys.spec.ts。对应的类型定义位于 ListIteratee.ts 与 IterateeShorthand.tsIterateeShorthandT展开为PropertyKey | [PropertyKey, any] | PartialShallowT与 lodash 的简写约定完全对齐。底层核心实现无论走 compat 层还是直接使用现代版真正的键转换逻辑都在 src/object/mapKeys.tsexport function mapKeysT extends RecordPropertyKey, any, K extends PropertyKey( object: T, getNewKey: (value: T[keyof T], key: ObjectKeysT, object: T) K ): RecordK, T[keyof T] { const result {} as RecordK, T[keyof T]; const keys Object.keys(object) as ArrayObjectKeysT; for (let i 0; i keys.length; i) { const key keys[i]; const value object[key]; result[getNewKey(value, key, object)] value; } return result; }实现思路非常朴素且高效通过Object.keys获取自有可枚举键用for循环逐个调用getNewKey生成新键并把原值写入新对象。它不依赖第三方迭代器也没有多余的兼容分支这正是现代版更快的直接原因。为什么文档建议优先使用现代版mapKeys原文档在开头给出了明确的::: warning提示compat 版的mapKeys因为要处理null/undefined判空以及iteratee简写转换过程相对更慢如果你的代码不需要 lodash 简写语法与边界兼容应当优先使用 es-toolkit 原生现代版本的mapKeys日文版见 docs/ja/reference/object/mapKeys.md。对比两者维度es-toolkit/compat的mapKeyses-toolkit原生mapKeys入口import { mapKeys } from es-toolkit/compatimport { mapKeys } from es-toolkitnull/undefined 容错返回{}需自行判空iteratee 简写字符串/数组/对象支持经iteratee()转换仅支持函数性能相对较慢多一层转换与判空更快、更精简需要注意的是compat 层定位是与 lodash 100% 行为对齐、可直接替换见 src/compat/index.ts因此它在健壮性与性能之间选择了兼容性优先而原生版追求的是现代 JavaScript 下的极简与高速。实际项目中全新代码推荐直接使用原生mapKeys存量 lodash 代码迁移时则先使用es-toolkit/compat版确保行为一致再按需逐步替换为原生实现。总结es-toolkit/compat的mapKeys完整继承了 lodash 的语义通过iteratee只转换键、保留值支持函数回调与多种简写形式并对null/undefined安全返回空对象。其实现本质是判空 iteratee 转换 委托原生实现的薄封装底层核心算法是Object.keys 单次循环。理解这层包装关系你就能在 lodash 迁移与性能敏感场景之间做出正确选择并随时可以通过 compat 源码 与 测试用例 验证其精确行为。【免费下载链接】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),仅供参考
返回列表