Javascript 二叉树更新
我在javascript中嵌套了对象,其中对象的id按深度递增。使用javascript支持,我添加id-2子数组中的对象将是3, 我需要的是更新(增量)id树中的所有兄弟姐妹,这只是一个示例代码,它应该适用于每种情况,例如id:4将变为5,其所有子代也将更改id为6、7、8等。此外,我们还需要更改父id,因为id正在更改检查,如下面所示Javascript 二叉树更新,javascript,arrays,object,Javascript,Arrays,Object,我在javascript中嵌套了对象,其中对象的id按深度递增。使用javascript支持,我添加id-2子数组中的对象将是3, 我需要的是更新(增量)id树中的所有兄弟姐妹,这只是一个示例代码,它应该适用于每种情况,例如id:4将变为5,其所有子代也将更改id为6、7、8等。此外,我们还需要更改父id,因为id正在更改检查,如下面所示 ( [id] => 1 [parent_id] => [children] => Array ( [0] =>
(
[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
(
)
)
)
)这个简单的递归函数(假设没有父节点的节点的parentId为
未定义的
或空的
)应该变异树并增加节点及其所有子节点的id和父id:
constupdateids=(树)=>{
tree.id++;
if(Number.isInteger(tree.parentId)){
parentId++;
}
tree.children.forEach(child=>{
更新ID(儿童);
})
}
这是id递增函数:
constupdateids=(树,insertedId)=>{
如果(tree.id>insertedId){
tree.id++;
}
if(Number.isInteger(tree.parentId)&&tree.parentId>insertedId){
parentId++;
}
tree.children.forEach(child=>{
updateIds(子项,插入项);
})
}
这是我的函数-
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;
}
在只有一种情况之前,一切都运行得很好,比如在根目录下添加同级元素,这样它就不会更新这个同级元素的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 );
这看起来像一个简单的预排序深度优先遍历。你试过写代码吗?没有,你能不能建议一下,但你是对的,它有dfs的东西,我确信你能发布一些东西!这个函数只是增加整个树中的id,这不是我想要的,我的观点是假设从数据中删除一个元素/对象,比如[id]=>3[parent_id]=>2[children]=>Array()然后,对于函数,应该更改相应的同级而不是整个树,如果在数据中插入对象,则需要一些提示,以迭代树的其余部分并适当地增加ID?可以通过编写递归函数来实现这一点(类似于上面的一个)增加id大于插入的想法,或者减少id大于删除的id。如果有效,我将尝试进行升级投票谢谢好运-如果没有,我将乐于帮助moreHy这是我的函数=函数modifyNestedItem(数组,itemName,newTeam){array.forEach((元素)=>{if(element.name==itemName){const childrenLength=element.children.length;newTeam.id=element.id+childrenLength+1;element.children=[…element.children,newTeam];}否则{modifyNestedItem(element.children,itemName,newTeam);});返回数组;}