我有一棵看起来像这样的树:
{
"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"
]
}
]
}
]
}
答案 0 :(得分:2)
这是设置利用this
的路径的小型递归迭代提议。
来源:
The bind()
方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。
Array#forEach()
,thisArg参数:如果向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>');