[英]Storing hierarchy of tree levels in recursion using javascript
function formSelectedTree(totaldata, selectedIds) {
if (!Array.isArray(totaldata)) return;
for (var item of totaldata) {
if ((!item.children || item.children.length === 0)) {
selectedIds.map(function(id, index) {
if (parseInt(item.id) === parseInt(id)) {
item.isSelected = true
item.open = true
}
})
} else {
this.formSelectedTree(item.children, selectedIds);
}
}
return totaldata
}
参数:
上面的递归函数是像json对象一样迭代树。 我们从后端获取叶节点的ID,根据这些ID,我们应该选择叶节点并从父级扩展树结构。
使用'isSelected'布尔属性处理选择。使用'open'布尔属性处理树节点的扩展。
我可以为叶节点设置这些属性。 但是面临为其父级/子级设置open = true的困难。
请找到以下示例json对象
{
"Data": [{
"id": 1745,
"parentId": null,
"isSelected": false,
"open": false,
"children": [{
"id": 1746,
"parentId": 1745,
"isSelected": false,
"open": false,
"children": [{
"id": 1747,
"parentId": 1746,
"isSelected": false,
"open": false
},
{
"id": 1748,
"parentId": 1746,
"isSelected": false,
"open": false,
"children": [{
"id": 1749,
"parentId": 1748,
"isSelected": false,
"open": false
}]
}
]
}]
}]
}
有人可以帮助我解决这一难题。
谢谢
本示例向遇到的每个节点添加一个parentNode属性,并在找到给定选定叶节点后使用该属性设置所有祖先的“开放”属性。
function formSelectedTree(totaldata, selectedIds, parentNode) { if (!parentNode) parentNode = false; if (!Array.isArray(totaldata)) return; for (var item of totaldata) { // set the parentNode property for each item we traverse item.parentNode = parentNode; if ((!item.children || item.children.length === 0)) { selectedIds.map(function(id, index) { if (parseInt(item.id) === parseInt(id)) { item.isSelected = true item.open = true // since this is a leaf item that is selected/open, all its ancestors should be open too var p = item.parentNode; while (p) { p.open = true; // travel up through the hierarchy until parentNode doesn't exist (top level) p = p.parentNode; } } }) } else { this.formSelectedTree(item.children, selectedIds, item); } } return totaldata; }
您可以使用Set
作为id
来使用另一种方法,如果所有ID已被处理,则可以使用Array#some
进行短路。
为了更新所有子节点,您可以使用另一个递归函数,该函数适用于实际节点以及子节点的回调。
如果您将字符串作为id
获得,则建议在创建集合之前将其转换为数据类型。
function formSelectedTree(totaldata, selectedIds) { function update(o) { o.isSelected = true; o.open = true; o.children && o.children.forEach(update); } if (!Array.isArray(totaldata)) { return; } return totaldata.some(function (item) { if (selectedIds.has(item.id)) { update(item); selectedIds.delete(item.id); return !selectedIds.size; } return item.children && formSelectedTree(item.children, selectedIds); }); } var data = { "Data": [{ "id": 1745, "parentId": null, "isSelected": false, "open": false, "children": [{ "id": 1746, "parentId": 1745, "isSelected": false, "open": false, "children": [{ "id": 1747, "parentId": 1746, "isSelected": false, "open": false }, { "id": 1748, "parentId": 1746, "isSelected": false, "open": false, "children": [{ "id": 1749, "parentId": 1748, "isSelected": false, "open": false }] }] }] }] }; formSelectedTree(data.Data, new Set([1749, 1747])); console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.