ARTICLE DETAIL

资讯详情

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

es-toolkit/compat 的 fromPairs 函数:将键值对数组转换为对象

es-toolkit/compat 的 fromPairs 函数:将键值对数组转换为对象 es-toolkit/compat 的 fromPairs 函数将键值对数组转换为对象【免费下载链接】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-toolkitfromPairs是 es-toolkit 兼容层es-toolkit/compat中用于把「键值对数组」转换为对象的核心工具函数与 lodash 的_.fromPairs语义一致。本指南将带你掌握fromPairs的完整用法、边界行为与底层实现原理并给出项目中推荐使用原生Object.fromEntries的性能建议适合在数据整理、键值反转、表单数据处理等场景中直接套用。概览什么是 fromPairsfromPairs接收一个由键值对组成的数组其中每个键值对本身是一个长度为 2 的数组——第一个元素作为对象的键key第二个元素作为对象的值value最终返回一个普通对象。const result fromPairs(pairs);该函数位于兼容层中可从es-toolkit/compat导入import { fromPairs } from es-toolkit/compat;在 es-toolkit 中fromPairs由 src/compat/object/fromPairs.ts 实现并经由 src/compat/compat.ts 统一导出与toPairssrc/compat/object/toPairs.ts互为逆向操作。基本用法将二维数组转换为对象是fromPairs最常见的应用import { fromPairs } from es-toolkit/compat; // 基础键值对转换 const pairs [ [a, 1], [b, 2], [c, 3], ]; const result fromPairs(pairs); // Result: { a: 1, b: 2, c: 3 } // 处理不同类型的值 const mixedPairs [ [name, John], [age, 30], [active, true], ]; const user fromPairs(mixedPairs); // Result: { name: John, age: 30, active: true }对应的验证逻辑见 src/compat/object/fromPairs.spec.ts 中的should convert an array of key-value pairs into an object与should accept a two dimensional array测试用例。边界行为空值与非法输入值为null、undefined或「非类数组对象」non-array-like object时fromPairs直接返回空对象import { fromPairs } from es-toolkit/compat; fromPairs(null); // {} fromPairs(undefined); // {} fromPairs(invalid); // {}这一行为在测试中被系统性地验证should accept a falseyarray用例对全部假值falsey输入逐一断言返回{}相关假值集合定义于 src/compat/_internal/falsey.ts若存在。底层原理isArrayLike 守卫从源码 src/compat/object/fromPairs.ts 可以确认函数的第一步就是调用isArrayLike进行守卫判断if (!isArrayLike(pairs)) { return {}; }isArrayLike定义于 src/compat/predicate/isArrayLike.ts其判定规则为值不为null/undefined、不是函数、且拥有合法的数值型length属性export function isArrayLike(value?: any): boolean { return value ! null typeof value ! function isLength((value as ArrayLikeunknown).length); }正因如此字符串invalid虽然本身是类数组length为 7但在isArrayLike的语义下仍被视为可接受输入——而文档明确说明非类数组输入返回{}。同时这也解释了为何文档提示该函数「因类数组检查与迭代处理而运行较慢」每一次调用都伴随isArrayLike的完整类型判定随后才进入逐元素赋值循环。函数签名与类型定义参数pairsArrayLike[PropertyName, T] | ArrayLikeany[] | null | undefined待转换为对象的键值对数组。其中PropertyName在源码中被定义为string | number | symbol见 src/compat/object/fromPairs.ts即支持字符串、数字与 Symbol 三种键类型。返回值Recordstring, any | Recordstring, T由键值对创建出的对象。源码通过三个重载签名实现精确的类型推断src/compat/object/fromPairs.ts当传入ArrayLike[PropertyName, T]时返回Recordstring, T保留值的类型信息当传入ArrayLikeany[]时返回Recordstring, any值类型放开为任意同时兼容null | undefined输入返回联合类型。支持的键类型fromPairs对键的类型支持非常灵活测试用例分别覆盖了数字键与 Symbol 键见 src/compat/object/fromPairs.spec.ts// 数字键转换为字符串形式的属性名 const result fromPairs([ [1, one], [2, two], [3, three], ]); // Result: { 1: one, 2: two, 3: three } // Symbol 键保持 Symbol 作为属性键 const sym1 Symbol(sym1); const sym2 Symbol(sym2); const result fromPairs([ [sym1, value1], [sym2, value2], ]); // Result: { [sym1]: value1, [sym2]: value2 }不支持深路径与 lodash 保持一致fromPairs不会解析路径字符串——键中包含的点号.会被原样保留为字面键名而非解释为嵌套路径const actual fromPairs([[a.b, 1]]); // Result: { a.b: 1 }此行为由测试用例should not support deep paths明确锁定。与 toPairs 的配合使用fromPairs常与toPairs配合实现对象与键值对数组之间的双向转换。测试用例should support consuming the return value oftoPairssrc/compat/object/fromPairs.spec.ts验证了二者的互逆关系import { fromPairs } from es-toolkit/compat; import { toPairs } from es-toolkit/compat; const object { a.b: 1 }; expect(fromPairs(toPairs(object))).toEqual(object);实现细节核心循环fromPairs的核心实现非常简洁src/compat/object/fromPairs.tsconst result: Recordstring, any {}; for (let i 0; i pairs.length; i) { const [key, value] pairs[i]; result[key] value; } return result;整个流程为先通过isArrayLike做空值守卫再遍历每个键值对用解构赋值取出key与value后直接写入结果对象。它接受任意类数组输入包含带length的类数组对象并依赖isArrayLike完成运行时校验。性能建议优先使用 Object.fromEntries文档中明确给出了性能警告由于fromPairs需要执行类数组检查与迭代处理运行速度较慢。在支持 ES2019 及以上的现代 JavaScript 运行环境中应当优先使用原生Object.fromEntriesconst pairs [ [a, 1], [b, 2], [c, 3], ]; // 推荐原生 API更快 const result Object.fromEntries(pairs); // Result: { a: 1, b: 2, c: 3 }Object.fromEntries在性能上远优于fromPairs同时语义几乎完全一致差异在于Object.fromEntries不执行isArrayLike类数组检查且不支持 Symbol 键以外的部分边界行为。只有在需要与 lodash 保持严格兼容例如迁移旧代码时才应使用es-toolkit/compat的fromPairs新代码请一律使用原生 API。小结fromPairs将「键值对数组」转换为对象支持字符串、数字与 Symbol 键且不解析深路径null、undefined等非类数组输入统一返回{}由isArrayLike守卫保证与toPairs互为逆操作适合对象 ↔ 键值对数组的双向转换由于涉及类数组检查与逐元素赋值性能弱于原生Object.fromEntries新代码推荐直接使用后者fromPairs仅作为 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),仅供参考
返回列表