Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 二叉树更新_Javascript_Arrays_Object - Fatal编程技术网

Javascript 二叉树更新

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] =>

我在javascript中嵌套了对象,其中对象的id按深度递增。使用javascript支持,我添加id-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
                    (
                    )

            )

    )

)

这个简单的递归函数(假设没有父节点的节点的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);});返回数组;}