如何在从根遍历到json树的目标节点时插入键?
Posted
技术标签:
【中文标题】如何在从根遍历到json树的目标节点时插入键?【英文标题】:How to insert key while traversing from root to the destination node of a json tree? 【发布时间】:2020-03-27 00:54:42 【问题描述】:假设我的 JSON 树将具有如下结构
var tree = [
iriID: "/api/catalogs/7",
id: 7,
name: "drywall",
children: [
iriID: "/api/catalogs/11",
id: 11,
name: "Vipuls catalog",
children: [
iriID: "/api/catalogs/10",
id: 10,
name: "test catalog 3",
children: []
,
iriID: "/api/catalogs/9",
id: 9,
name: "test catalog",
children: []
]
,
]
,
];
我想在从第一个节点遍历到具有 id=9 的节点时插入一个键 travelled=true 。最终输出应如下所示。
var tree = [
iriID: "/api/catalogs/7",
id: 7,
name: "drywall",
traversed: true,
children: [
iriID: "/api/catalogs/11",
id: 11,
name: "Vipuls catalog",
traversed: true,
children: [
iriID: "/api/catalogs/10",
id: 10,
name: "test catalog 3",
children: []
,
iriID: "/api/catalogs/9",
id: 9,
name: "test catalog",
traversed: true,
children: []
]
,
]
,
];
希望你能理解我的要求。只需确保查找最短路径的代码经过优化且功能良好。
【问题讨论】:
child.traversed = true
?或者让 Vue 接受更改,this.$set(child, 'traversed', true)
。遍历树的代码在哪里?
你真的需要/想要修改你的树吗?将您的遍历信息保存在一个单独的结构中会更明智。
是的,无论您找到哪种方式,请分享,修改也可以
奇怪你的树是一个数组?由于一棵树只有一个根,如果这个数组有两个或多个元素意味着什么?
【参考方案1】:
我会使用递归函数来收集到目标节点路径上的节点。然后,您可以决定对该路径上的节点执行您想要的操作,例如给他们额外的财产:
function getPathTo(nodes, id)
for (let node of nodes)
if (node.id === id) return [node];
let path = getPathTo(node.children || [], id);
if (path) return [node, ...path];
// Demo
var tree = [iriID: "/api/catalogs/7",id: 7,name: "drywall",children: [iriID: "/api/catalogs/11",id: 11,name: "Vipuls catalog",children: [iriID: "/api/catalogs/10",id: 10,name: "test catalog 3",children: [], iriID: "/api/catalogs/9",id: 9,name: "test catalog",children: []]]];
let path = getPathTo(tree, 9) || [];
console.log(path.map(node => node.id));
path.forEach(node => node.traversed = true);
console.log(tree);
【讨论】:
【参考方案2】:可以通过递归遍历来实现。
function modify(ob, id)
if(ob.id == id)
ob[traversed] = true
else
for(var i=0;i<ob.children.length;i++)
modify(ob.children[i],id);
【讨论】:
您的尝试很有用,但没有产生上述结果。以上是关于如何在从根遍历到json树的目标节点时插入键?的主要内容,如果未能解决你的问题,请参考以下文章