在JS / ES6中递归转换树

问题描述 投票:2回答:1

我目前正在尝试变换一个树,以这种形式给出:

{"Parent": 
    {
    "Child1": ["toy1"],
    "Child2": 
          {
              "Nephew": ["toy2", "toy3"]
          }
    }
}

进入以下形式的树:

{
"name": "root",
"children": 
    [{"name":"Parent",
      "children": 
          [{
          "name":"Child1",
          "children": ["toy1"]
          },
          {
          "name":"Child2"
          "children": 
              [{
              "name":"Nephew",
              "children": ["toy2", "toy3"]
              }]
          }]
    }]
}

所以基本上我想标准化树的结构。我尝试使用以下代码:

function recurse(elem) {
    if (typeof(elem) !== "object") return elem;
    level = [];
    for (let part in elem) {
        level.push({
            name: part,
            children: recurse(elem[part])
        });
        console.log(level);
    }
    return level;
}
restrucTree = {
    name: "root",
    children: recurse(tree)
};

但是,由于根节点(在本例中为“Parent”)未包含在转换树中,因此显然存在关于正确递归和构建对象的一些错误。此外,如果树在多个子树中分支,则该方法失败。在这种情况下,只有最后一个被识别。我最好的猜测是,在弹出递归的堆栈时,存储的对象会丢失,但不知怎的,我无法将其转换为解决方案。如果你有任何想法,这个错误来自哪里,我将非常感激!

javascript recursion data-structures tree
1个回答
0
投票

您可以采用递归方法并迭代所有键并构建新对象并获取数组或获取对象以进行下一次递归调用。

function getParts(object) {
    return Array.isArray(object)
        ? object
        : Object.keys(object).map(function (k) {
            return { name: k, children: getParts(object[k]) };
        });
}

var data = { Parent: { Child1: ["toy1"], Child2: { Nephew: ["toy2", "toy3"] } } },
    result = { name: 'root', children: getParts(data) };

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
© www.soinside.com 2019 - 2024. All rights reserved.