[英]MLM binary tree update
我在 javascript 中嵌套了 object ,其中 object 的 id 正在增加深度。 使用 javascript 支持我在 id 中添加和 object - 2 個子數組將為 3,我需要更新(遞增)id 樹中的所有兄弟姐妹,這只是一個示例代碼,它應該適用於每種情況,例如 id: 4 將變成 5 並且它的所有孩子也將更改 id 更改為 6、7、8 等,我們還需要更改父 id,因為 id 正在更改檢查,例如下面
(
[id] => 1
[parent_id] =>
[children] => Array
(
[0] => Array
(
[id] => 2
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[id] => 3
[parent_id] => 2
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 4
[parent_id] => 1
[children] => Array
(
[0] => Array
(
[id] => 5
[parent_id] => 3
[children] => Array
(
)
)
[1] => Array
(
[id] => 6
[parent_id] => 3
[children] => Array
(
)
)
[2] => Array
(
[id] => 7
[parent_id] => 4
[children] => Array
(
)
)
)
)
[2] => Array
(
[id] => 8
[parent_id] => 1
[children] => Array
(
)
)
)
)
這個簡單的遞歸 function (假設沒有父節點的節點的 parentId 為undefined
或null
)應該改變樹並增加節點及其所有子節點的 id 和父 id:
const updateIds = (tree) => {
tree.id++;
if (Number.isInteger(tree.parentId)) {
tree.parentId++;
}
tree.children.forEach(child => {
updateIds(child);
})
}
這是 id 遞增的 function:
const updateIds = (tree, insertedId) => {
if (tree.id > insertedId) {
tree.id++;
}
if (Number.isInteger(tree.parentId) && tree.parentId > insertedId) {
tree.parentId++;
}
tree.children.forEach(child => {
updateIds(child, insertedId);
})
}
這是我的 function 吹 -
var insId = '';
function updateIds( tree, itemName, newTeam ) {
if ( tree.name === itemName ) {
const childrenLength = tree.children.length;
newTeam.id = tree.id + childrenLength + 1;
insId = tree.id + childrenLength + 1;
tree.children = [ ...tree.children, newTeam ];
}
if ( insId !== '' && tree.id >= insId && tree.name !== newTeam.name ) {
tree.id++;
}
if ( insId !== '' && Number.isInteger(tree.parent_id) && tree.parent_id >= insId && tree.name !== newTeam.name) {
tree.parent_id++;
}
tree.children.forEach(child => {
updateIds(child, itemName, newTeam );
});
return tree;
}
一切都很好,直到只有一個案例 senario,比如在根處添加兄弟元素,所以它不會更新這個兄弟元素的 id
如果有人正在尋找對我有用的此類問題,請在下面添加項目部分是解決方案
function depthItem( element ) {
let children = '';
if ( element.children.length > 0 ) {
children = element.children[ element.children.length - 1 ];
return depthItem( children );
}
return element;}
function addNestedItem( array, itemName, newTeam ) {
array.forEach( ( element ) => {
if ( element.name === itemName ) {
const lastItem = depthItem( element );
newTeam.id = lastItem.id + 1;
element.children = [ ...element.children, newTeam ];
} else {
return addNestedItem( element.children, itemName, newTeam );
}
} );
return array;}
function updgradeNestedItemIndex( array, newTeam ) {
array.forEach( ( element ) => {
if ( element.id >= newTeam.id && element.name !== newTeam.name ) {
element.id++;
}
return updgradeNestedItemIndex( element.children, newTeam );
} );
return array;}
const tempTree = addNestedItem( [ tree ], team.name, newTeam );
const newTree = updgradeNestedItemIndex( tempTree, newTeam );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.