如何递归树并创建父路径节点数组?

时间:2016-03-02 16:55:27

标签: javascript

我有一棵看起来像这样的树:

{
    "name": "A",
    "children": [
        {
            "name": "B",
            "children": [
                {
                    "name": "C",
                    "children": [
                        {
                            "name": "D"
                        },
                        {
                            "name": "E"
                        }
                    ]
                },
                {
                    "name": "F"
                }
            ]
        },
        {
            "name": "G",
            "children": [
                {
                    "name": "H"
                }
            ]
        }
    ]
}

我想遍历我的树,并为每个节点添加父组件的路径信息。所以,使用上面的例子,我正在寻找如何生成这个:

{
    "name": "A",
    "path": [
        "A"
    ],
    "children": [
        {
            "name": "B",
            "path": [
                "A",
                "B"
            ],
            "children": [
                {
                    "name": "C",
                    "path": [
                        "A",
                        "B",
                        "C"
                    ],
                    "children": [
                        {
                            "name": "D",
                            "path": [
                                "A",
                                "B",
                                "C",
                                "D"
                            ]
                        },
                        {
                            "name": "E",
                            "path": [
                                "A",
                                "B",
                                "C",
                                "E"
                            ]
                        }
                    ]
                },
                {
                    "name": "F",
                    "path": [
                        "A",
                        "B",
                        "F"
                    ]
                }
            ]
        },
        {
            "name": "G",
            "path": [
                "A",
                "G"
            ],
            "children": [
                {
                    "name": "H",
                    "path": [
                        "A",
                        "G",
                        "H"
                    ]
                }
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:2)

这是设置利用this的路径的小型递归迭代提议。

来源:

  

The bind()方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。

  

如果向forEach()提供了thisArg参数,则在调用时它将被传递给回调,以用作其值。否则,将传递值undefined以用作此值。最终可通过回调观察到的这个值是根据to the usual rules for determining the this seen by a function确定的。

function setPath(o) {
    o.path = this.concat(o.name);
    Array.isArray(o.children) && o.children.forEach(setPath, o.path);
};

var object = { "name": "A", "children": [{ "name": "B", "children": [{ "name": "C", "children": [{ "name": "D" }, { "name": "E" }] }, { "name": "F" }] }, { "name": "G", "children": [{ "name": "H" }] }] };

setPath.bind([])(object);
document.write('<pre>' + JSON.stringify(object, 0, 4) + '</pre>');