如何从带层级标注的扁平化映射生成嵌套数组?
实现思路与代码方案
这个需求本质是把带层级分隔符的扁平键值对转换成嵌套数组,核心是解析每个键的层级路径,然后把值映射到对应的嵌套位置。我用JavaScript/TypeScript来实现,思路很清晰:
核心思路
- 解析层级路径:把每个键(比如
"3-1-0")按"-"分割成数字数组([3,1,0]),这个数组就是值在嵌套数组中的位置路径。 - 逐层构建嵌套结构:从根数组开始,沿着路径找到对应的父容器;如果中间某层不存在,就创建一个空数组作为容器。
- 赋值到目标位置:把值放到路径的最后一个索引位置,完成层级映射。
JavaScript 实现代码
function flattenToNested(flatObj) { const root = []; Object.entries(flatObj).forEach(([key, value]) => { // 拆分键为层级路径数组 const path = key.split('-').map(Number); let current = root; // 遍历路径的前n-1个节点,确保父容器存在 for (let i = 0; i < path.length - 1; i++) { const index = path[i]; if (!Array.isArray(current[index])) { current[index] = []; } current = current[index]; } // 将值放入最后一个路径节点对应的位置 const lastIndex = path[path.length - 1]; current[lastIndex] = value; }); return root; } // 测试你的示例数据 const flatData = { '0': '0', '1': '1', '2-0': '2-0', '2-1': '2-1', '3-0': '3-0', '3-1-0': '3-1-0', '3-1-1': '3-1-1', '3-2': '3-2' }; console.log(flattenToNested(flatData)); // 输出:[ '0', '1', [ '2-0', '2-1' ], [ '3-0', [ '3-1-0', '3-1-1' ], '3-2' ] ]
TypeScript 类型安全版本
如果需要类型约束,可以加上泛型和嵌套数组类型定义:
// 定义嵌套数组类型 type NestedArray<T> = T | NestedArray<T>[]; function flattenToNested<T>(flatObj: Record<string, T>): NestedArray<T>[] { const root: NestedArray<T>[] = []; Object.entries(flatObj).forEach(([key, value]) => { const path = key.split('-').map(Number); let current: NestedArray<T>[] = root; for (let i = 0; i < path.length - 1; i++) { const index = path[i]; if (!Array.isArray(current[index])) { current[index] = []; } // 类型断言确保当前容器是数组 current = current[index] as NestedArray<T>[]; } const lastIndex = path[path.length - 1]; current[lastIndex] = value; }); return root; }
额外说明
- 这个方案不要求键的遍历顺序,因为我们直接通过索引赋值,不管先处理哪个键,最终都会放到正确的位置。
- 如果遇到非数字的层级键(比如
"a-b"),只需要调整split后的类型转换逻辑即可,核心思路不变。 - 支持任意深度的嵌套,只要键的层级格式符合
x-y-z...的结构就行。
内容的提问来源于stack exchange,提问作者Hironori
相关产品推荐
相关产品推荐

