资讯动态

es-toolkit compat 的 entriesIn / toPairsIn:将对象(含继承属性)转换为键值对数组的完整指南

发布时间:2026/9/15 16:24:18 来源:尧图企业网站定制
es-toolkit compat 的 entriesIn / toPairsIn将对象含继承属性转换为键值对数组的完整指南【免费下载链接】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-toolkitentriesIn是 es-toolkit 兼容层es-toolkit/compat中toPairsIn的别名二者在功能上完全等价把对象、Map或Set转换为[key, value]键值对数组并且会包含原型链上的可枚举继承属性。本文以 entriesIn 官方参考文档 为骨架结合其指向的 toPairsIn 完整文档 以及仓库源码系统讲解该函数的用法、边界行为、底层实现与性能注意事项读完即可在需要遍历自有 继承属性键值对的场景中正确选用它。entriesIn 是什么一个指向 toPairsIn 的别名在 es-toolkit 的 compat 层中entriesIn并非独立实现而是toPairsIn的直接导出别名。官方文档对此有明确说明entriesInis an alias oftoPairsIn. See thetoPairsIndocumentation for details.从源码可以印证这一点。entriesIn.ts 全文只有一行export { toPairsIn as entriesIn } from ./toPairsIn.ts;也就是说entriesIn与toPairsIn是同一个函数引用二者用法、返回值、边界行为完全一致。这也是为什么官方文档将entriesIn作为别名收录在 toPairsIn 页面之下并为其单独保留了重定向文档。在测试用例中同样验证了这一别名关系。entriesIn.spec.ts 的核心断言就是it(should be an alias of toPairsIn, () { expect(entriesIn).toBe(toPairsIn); });基础用法把对象转换为键值对数组使用entriesIn或等价的toPairsIn时从es-toolkit/compat导入即可import { toPairsIn } from es-toolkit/compat; // 普通对象转换 const object { a: 1, b: 2 }; toPairsIn(object); // [[a, 1], [b, 2]]它的类型签名见 toPairsIn.ts支持两种形态export function toPairsInT(object?: Recordstring, T | Recordnumber, T): Array[string, T]; export function toPairsIn(object?: object): Array[string, any];参数object要转换的对象普通对象、Map、Set均可。参数是可选的传入null或undefined时返回空数组[]。返回值Array[string, any]即键值对数组包含继承属性。与 toPairs 的关键区别包含原型链属性toPairsIn与toPairs最大的不同在于toPairsIn会枚举原型链上的可枚举属性而toPairs只处理对象自身的属性。官方文档给出的继承属性示例import { toPairsIn } from es-toolkit/compat; function Parent() { this.inherited value; } Parent.prototype.proto property; const child new Parent(); child.own own; toPairsIn(child); // [[inherited, value], [own, own], [proto, property]]可以看到constructor之后的原型属性proto、构造函数内赋值的inherited以及实例自身的own都被纳入了结果。对应的测试用例见 toPairsIn.spec.tsFoo.prototype.b 2会被正确收录进结果数组。对 Map 与 Set 的特殊处理除了普通对象toPairsIn还能直接转换Map和Set这是它与原生Object.entries()的一个重要差异Object.entries对Map/Set只会返回空数组。官方文档示例import { toPairsIn } from es-toolkit/compat; // Map 对象转换 const map new Map([ [key1, value1], [key2, value2], ]); toPairsIn(map); // [[key1, value1], [key2, value2]] // Set 对象转换 const set new Set([1, 2, 3]); toPairsIn(set); // [[1, 1], [2, 2], [3, 3]]注意Set的转换规则每个元素被映射为[value, value]形式键和值相同而不是[index, value]。这一行为在 toPairsIn.ts 中通过类型分支实现if (object instanceof Set) { return setToEntries(object); } if (object instanceof Map) { return mapToEntries(object); }对应的 setToEntries.ts 实现为export function setToEntriesT(set: SetT): Array[T, T] { const arr new Array[T, T](set.size); const values set.values(); for (let i 0; i arr.length; i) { const value values.next().value as T; arr[i] [value, value]; } return arr; }而 mapToEntries.ts 则通过并行迭代Map的 keys 与 values 迭代器来组装结果export function mapToEntries(map: Mapany, any) { const arr new Array(map.size); const keys map.keys(); const values map.values(); for (let i 0; i arr.length; i) { arr[i] [keys.next().value, values.next().value]; } return arr; }测试用例 toPairsIn.spec.ts 分别验证了Map[[a, 1], [b, 2]]与Set[[1, 1], [2, 2]]的转换结果。底层实现keysIn 与遍历逻辑对于普通对象toPairsIn并不直接使用for...in而是先调用 compat 层的keysIn获取自有 继承的键集合再逐键取值组装const keys keysInToolkit(object); const result: Array[key: string, value: any] new Array(keys.length); for (let i 0; i keys.length; i) { const key keys[i]; const value object[key as keyof typeof object]; result[i] [key, value]; } return result;见 toPairsIn.ts其中keysIn见 keysIn.ts承担了复杂的键收集逻辑传入null/undefined时返回空数组对类数组对象isArrayLike按数组语义处理为每个索引生成字符串形式的键再合并其余继承键对原型对象isPrototype会过滤掉constructor键对普通对象则退化为for...in收集所有可枚举键见keysInImplkeysIn.ts。这也解释了为什么toPairsIn能正确处理字符串、带length属性的对象等特殊输入。测试用例验证了这类边界// 字符串转换见 toPairsIn.spec.ts L74-L82 toPairsIn(xo); // [[0, x], [1, o]] // 带 length 属性的对象见 toPairsIn.spec.ts L43-L52 const object { 0: a, 1: b, length: 2 }; toPairsIn(object); // [[0, a], [1, b], [length, 2]]性能提示何时应该改用原生 API官方文档在 toPairsIn 页面顶部给出了明确的警告由于要处理继承属性、Map、Set等复杂逻辑toPairsIn的运行速度较慢。如果不需要继承属性请使用更快、更现代的Object.entries()如果需要继承属性请直接使用for...in循环。原因从源码结构即可看出toPairsIn的完整调用链包含instanceof判断、keysIn内部的isArrayLike/isPrototype/isTypedArray/isBuffer等多项检测加上对Map/Set迭代器的封装比原生 API 的常数开销大得多。实际选型建议需求推荐方案只需对象自身可枚举属性Object.entries(object)原生最快需要含继承属性的键值对for...in循环 手动收集或toPairsIn需要转换Map/SettoPairsIn(map)/toPairsIn(set)或手动Array.from(map)边界行为与注意事项总结综合文档、源码与测试entriesIn/toPairsIn的关键行为可归纳如下空值安全传入null或undefined返回[]不会抛错toPairsIn.ts测试见 toPairsIn.spec.ts继承属性包含原型链上的可枚举属性会出现在结果中这是与toPairs、Object.entries()的本质区别Map按插入顺序输出[key, value]对Set输出[value, value]对键值相同结果顺序普通对象的输出顺序取决于for...in的枚举顺序字符串键按插入序、整数键按升序对顺序敏感的场景建议自行排序别名等价entriesIn与toPairsIn是同一个函数可互换使用。如需进一步阅读完整文档与实现可参考 toPairsIn 参考文档、toPairsIn 源码、keysIn 源码 及对应的 toPairsIn 测试。【免费下载链接】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),仅供参考

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

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

免费获取报价