ARTICLE DETAIL

资讯详情

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

es-toolkit/compat 中 zipObjectDeep 完全指南:将路径数组与值数组构造成深层嵌套对象

es-toolkit/compat 中 zipObjectDeep 完全指南:将路径数组与值数组构造成深层嵌套对象 es-toolkit/compat 中 zipObjectDeep 完全指南将路径数组与值数组构造成深层嵌套对象【免费下载链接】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-toolkitzipObjectDeep是 es-toolkit 兼容 Lodash API 的es-toolkit/compat子路径中提供的一个数组工具函数它接受一组属性路径与一组对应值按路径把值写入并构造出一个深层嵌套的对象。本文将以 官方参考文档 为主体结合 源码实现 与 测试用例完整讲解该函数的用法、参数、边界行为与底层原理帮助你掌握把扁平键值对转换为层级化数据结构的实战技能。函数概览zipObjectDeep的作用一句话即可概括使用第一个数组中的路径与第二个数组中的值构造一个深度嵌套的对象。路径既可以写成点号分隔的字符串如a.b.c也可以写成属性名数组如[a, b, c]甚至支持包含数组下标的路径如a.b[0].c。const result zipObjectDeep(keys, values);该函数在需要生成复杂嵌套数据结构或需要把扁平键值对转换为层级对象时非常实用。与只能处理一层键值对的zipObject相比zipObjectDeep能够沿着路径逐层创建中间对象或数组是构造配置对象、树形数据时的便捷工具。快速上手路径使用点号分隔字符串最常见的用法是把点号路径与值一一对应import { zipObjectDeep } from es-toolkit/compat; const paths [a.b.c, d.e.f]; const values [1, 2]; const result zipObjectDeep(paths, values); // Returns: { a: { b: { c: 1 } }, d: { e: { f: 2 } } }路径使用属性名数组路径也可以直接以数组形式给出效果与点号字符串完全一致import { zipObjectDeep } from es-toolkit/compat; const pathArrays [ [a, b, c], [d, e, f], ]; const values2 [1, 2]; const result2 zipObjectDeep(pathArrays, values2); // Returns: { a: { b: { c: 1 } }, d: { e: { f: 2 } } }路径包含数组下标当路径中出现[0]、[1]这类下标时函数会自动在中间层级创建数组并按下标填入元素import { zipObjectDeep } from es-toolkit/compat; const arrayPaths [a.b[0].c, a.b[1].d]; const values3 [1, 2]; const result3 zipObjectDeep(arrayPaths, values3); // Returns: { a: { b: [{ c: 1 }, { d: 2 }] } }null / undefined 键数组当keys传入null或undefined时函数将其视为空对象处理直接返回{}import { zipObjectDeep } from es-toolkit/compat; zipObjectDeep(null, [1, 2]); // {} zipObjectDeep(undefined, [1, 2]); // {}参数与返回值参数参数类型说明keysArrayLikePropertyPath \| null \| undefined属性路径数组。每个路径可以是点号分隔字符串也可以是属性名数组valuesArrayLikeany可选与路径一一对应的值数组。未提供时按空数组处理其中PropertyPath在 src/compat/_internal/PropertyPath.ts 中定义为ManyPropertyKey即PropertyKey | readonly PropertyKey[]说明路径既可以是单个键数字、字符串或 Symbol也可以是一组键的数组。返回值object根据给定路径与值构造出的深度嵌套对象。边界行为来自源码与测试的佐证zipObjectDeep的健壮性体现在大量边界情况的处理上这些行为都能在 src/compat/array/zipObjectDeep.spec.ts 的测试用例中得到验证1. 键数组比值数组长多出的键会被赋值为undefined。expect(zipObjectDeep([a, b], [1])).toEqual({ a: 1, b: undefined }); expect(zipObjectDeep([a, b, c], [1, 2])).toEqual({ a: 1, b: 2, c: undefined });2. 值数组比键数组长多余的值会被忽略。expect(zipObjectDeep([a], [1, 2])).toEqual({ a: 1 }); expect(zipObjectDeep([a, b], [1, 2, 3])).toEqual({ a: 1, b: 2 });3. 键支持数字与 Symbol数字键会作为对象属性写入Symbol 也可以作为键。const symbols [Symbol(a), Symbol(b)]; expect(zipObjectDeep(symbols, [1, 2])).toEqual({ [symbols[0]]: 1, [symbols[1]]: 2 }); expect(zipObjectDeep([0, 1], [1, 2])).toEqual({ 0: 1, 1: 2 });4. 深层路径与数组下标混合不同路径可以共享前缀数组下标的空洞位置会以undefined填充。expect(zipObjectDeep([a.b.c, a.b.d, a.b.e.f], [1, 2, 3])).toEqual({ a: { b: { c: 1, d: 2, e: { f: 3 } } }, }); expect(zipObjectDeep([0, a.b, symbols[0], a.c[0], a.c[2].a], [1, 2, 3, 4, 5])).toEqual({ 0: 1, [symbols[0]]: 3, a: { b: 2, c: [4, undefined, { a: 5 }] }, });5. 支持类数组array-like的键与值keys和values的类型是ArrayLike因此带有length属性的对象甚至字符串都可以作为输入。// 类数组键 expect(zipObjectDeep({ 0: [a], length: 1 }, [1])).toEqual({ a: 1 }); expect(zipObjectDeep(12, [1, 2])).toEqual({ 1: 1, 2: 2 }); // 类数组值 expect(zipObjectDeep([a], { 0: 1, length: 1 })).toEqual({ a: 1 }); expect(zipObjectDeep([a, b], 12)).toEqual({ a: 1, b: 2 });6. 值为空或缺失当values未提供且键数组类数组时所有键的值都是undefined。expect(zipObjectDeep([1, 2, 3], undefined)).toEqual({ 1: undefined, 2: undefined, 3: undefined });源码实现与底层调用链完整的实现只有不到 20 行核心逻辑位于 src/compat/array/zipObjectDeep.tsexport function zipObjectDeep(keys?: ArrayLikePropertyPath, values?: ArrayLikeany): object { const result {}; if (!isArrayLike(keys)) { return result; } if (!isArrayLike(values)) { values []; } const zipped zip(Array.from(keys), Array.from(values)); for (let i 0; i zipped.length; i) { const [key, value] zipped[i]; if (key ! null) { set(result, key, value); } } return result; }从源码结构可以梳理出清晰的调用链isArrayLike守卫通过 src/compat/predicate/isArrayLike.ts 判断keys是否为类数组。若不是如null、undefined直接返回空对象values非类数组时则替换为空数组。这就是文档中null/undefined 键数组视为空对象行为的实现来源。zip配对调用 src/array/zip.ts 把键数组与值数组按索引配对为元组数组。zip以最长数组长度为准生成结果缺位元素为undefined——这解释了为何键比值多时多余键的值为undefined。set深写入对每个[key, value]元组调用 src/compat/object/set.ts 将值写入路径。set内部委托给 src/compat/object/updateWith.ts后者会把字符串路径通过 src/compat/util/toPath.ts 解析为路径段数组并沿途按需创建中间对象或数组当下一个路径段是数组下标时创建[]否则创建{}同时通过isUnsafeToWriteProperty防御__proto__等危险属性的写入。正是toPath负责解析a.b[0].c这类混合语法它支持点号分隔、方括号下标、引号包裹的键如a[b.c].d以及转义字符为zipObjectDeep提供了与 Lodash 一致的路径解析能力。与相关函数的区分在es-toolkit/compat中还有几个名字相近的函数容易混淆zipObject仅处理一层键值对路径不会展开为嵌套结构适合扁平对象场景zipWith先通过迭代函数变换再配对侧重值的加工而非路径的嵌套zipObjectDeep本函数路径可深可含数组下标专为层级化数据结构设计。需要构造嵌套配置、树形数据或把a.b.c形式的扁平键还原为多层对象时zipObjectDeep就是最直接的选择。它的完整行为定义、参数类型与返回值约定均可查阅 官方参考文档而 测试文件 提供了大量可直接运行的边界用例适合作为理解其语义的补充材料。【免费下载链接】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),仅供参考
返回列表