我有一个像这样的json对象
{
"id": 1,
"name": "A",
"nodes": [
{
"id": 2,
"name": "B",
"nodes": [
{
"id": 3,
"name": "C",
"nodes": []
}
]
}
]
}
如果我输入了对象的id,让我们取id:3,我将如何扫描整个三个找到具有特定id的对象,然后向上扫描到最后一个父对象。
所以扫描完成后,我知道C有父B,B有父A,所以我可以像A-B-C那样打印
所有这些都是基于我知道我想找到父母的对象的身份。
上述对象可以是任何长度,并且可以具有许多节点和级别。所以任何人都知道如果从特定级别开始,如何将关卡遍历到顶级?
编辑:
当我尝试解析此
时let data = [
{
"id": 1,
"name": "name",
"testing": "something",
"nodes": [
{
"id": 11,
"name": "name",
"testing": "something",
"nodes": []
}
]
},
{
"id": 2,
"name": "name",
"testing": "something",
"nodes": []
}
]
通过执行JSON.parse(数据)到json对象我收到错误
SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
也尝试了这个
let jsonObject = JSON.stringify($scope.data);
jsonObject = JSON.parse(jsonObject);
createTree(jsonObject, null, nodeData.id)
并得到不同的错误:
TypeError: obj.nodes is not iterable
答案 0 :(得分:2)
执行基本DFS扫描,沿途添加parent
属性,并在找到节点时爬升。
let jsonParsed = JSON.parse(`
{
"id": 1,
"name": "A",
"nodes": [
{
"id": 2,
"name": "B",
"nodes": [
{
"id": 3,
"name": "C",
"nodes": []
}
]
}
]
}
`)
let arr = []
function climbTree(obj) {
arr.unshift(obj.name)
if (obj.parent) {
climbTree(obj.parent)
}
}
function createTree(obj, parent = null, targetId = null) {
obj.parent = parent
if (targetId === obj.id) {
return climbTree(obj)
}
for (let node of obj.nodes) {
createTree(node, obj, targetId)
}
}
createTree(jsonParsed, null, 3)
console.log(arr.join('-'))