从json对象中的特定点遍历并查找所有父项

时间:2018-03-15 02:02:55

标签: javascript json

我有一个像这样的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

1 个答案:

答案 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('-'))