You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript技术问询:如何将嵌套字典转换为树形数组结构

解决方案

刚好我之前也处理过类似的需求,你已经完成了一半——把点分隔的字符串转成嵌套字典,现在只需要把这个字典转换成标准的树形数组结构(每个节点包含name和可选的children字段)就行。我给你写个完整的实现,结合你现有的代码一起用:

1. 补全你现有的items_to_tree函数

你原来的函数没写完最后一步,我帮你补上:

function items_to_tree(items) {
  var arr = {};
  items.forEach(function(item){
    var parts = item.split(".");
    var last = parts.pop();
    var cursor = arr;
    parts.forEach(function(part){
      if(!cursor[part]) cursor[part] = {};
      cursor = cursor[part];
    });
    // 给最后一个层级的节点赋值空对象,作为叶子节点的标记
    cursor[last] = {};
  });
  return arr;
}

2. 实现嵌套字典转树形数组的函数

这个函数通过递归遍历字典的层级,把每个键转换成节点的name,子字典转换成children数组:

function dictToTree(nestedDict) {
  // 遍历字典的所有键值对,生成树形节点数组
  return Object.entries(nestedDict).map(([name, childrenDict]) => {
    const node = { name };
    // 如果子字典还有子节点,递归生成children数组
    const childNodes = dictToTree(childrenDict);
    if (childNodes.length > 0) {
      node.children = childNodes;
    }
    return node;
  });
}

3. 完整使用示例

把输入字符串数组先转成嵌套字典,再转成树形数组:

// 测试输入
const inputItems = ["a.b.c", "a.d.e", "f.g", "h"];

// 第一步:生成嵌套字典
const nestedDict = items_to_tree(inputItems);
// 此时nestedDict的结构是:
// { a: { b: { c: {} }, d: { e: {} } }, f: { g: {} }, h: {} }

// 第二步:转成树形数组
const treeArray = dictToTree(nestedDict);
console.log(treeArray);

输出的树形数组结构如下:

[
  {
    "name": "a",
    "children": [
      { "name": "b", "children": [ { "name": "c" } ] },
      { "name": "d", "children": [ { "name": "e" } ] }
    ]
  },
  {
    "name": "f",
    "children": [ { "name": "g" } ]
  },
  { "name": "h" }
]

逻辑说明

  • dictToTree用Object.entries遍历字典的键和对应的子字典,每个键直接作为节点的name。
  • 递归处理子字典:如果子字典能生成非空的children数组,就给当前节点添加children字段;如果是叶子节点(子字典为空),就只保留name字段。
  • 这种递归方式可以适配任意深度的嵌套结构,完全匹配你输入字符串的层级。

内容的提问来源于stack exchange,提问作者Harshit Laddha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:10:16