Как обновить конкретный c узел глобального объекта json с древовидной структурой в javascript? - PullRequest
0 голосов
/ 21 июня 2020

Я передал глобальную древовидную структуру JSON в причудливое дерево jquery. Я могу добавить данные нового узла к глобальному объекту. Я не могу обновить конкретный узел c глобальной строки JSON, хотя я могу найти этот конкретный c узел.

Я пробовал следующий способ делать то, что хотел, но в конец глобальная переменная не изменяется. Я также пробовал рекурсивный способ, но тоже не работал. Также это мой первый вопрос в stackoverflow. Я упростил данные, потому что реальные данные очень большие.

// global json object array
var treeViewData = [
    {
        "nodeData": {
            "physicalid": "A",
            "rootToNode": "A-0",
            "level": "0",
            "attribute": "English-english"
        },
        "children": [
            {
                "nodeData": {
                    "physicalid": "B",
                    "rootToNode": "A-0:B-1",
                    "level": "1",
                    "attribute": "Finish-finish"
                },
                "children": []
            },
            {
                "nodeData": {
                    "physicalid": "C",
                    "rootToNode": "A-0:C-1",
                    "level": "1",
                    "attribute": "Arabic-arabic"
                },
                "children": [
                    {
                        "nodeData": {
                            "physicalid": "D",
                            "rootToNode": "A-0:C-1:D-2",
                            "level": "2",
                            "attribute": "Spanish-spanished"
                        },
                        "children": []
                    }
                ]
            }
        ]
    }
]

Вот метод обновления. rootToNode уникален.

findAndUpdateNodeIterative: function(selfNodeRootPath, updatedNode) {

    console.log("+++++++++ findAndUpdateNodeIterative ++++++++");
    var thisContext = this;
    var currentNode = thisContext.treeViewData[0];
    var i, currentChild, result;
    var flag = true;
    while (flag) {
        if (currentNode.nodeData.rootToNode === selfNodeRootPath) {
            currentNode.nodeData.attribute = updatedNode.nodeData.attribute;
            flag = false;
        } else {
            let it = true;
            for (i = 0; i < currentNode.children.length && it; i += 1) {
                currentChild = currentNode.children[i];
                var currentNodeLevel = parseInt(currentChild.nodeData.level);
                var targetPhysicalId = selfNodeRootPath.split(':')[currentNodeLevel].split("-")[0];
                if (targetPhysicalId === currentChild.nodeData.physicalid) {
                    // Search in the current child
                    currentNode = currentChild;
                    it = false;
                }
            }
        }
    }
    console.log("---------- findAndUpdateNodeIterative ---------");
},

использование

var updatedNode = {
                        "nodeData": {
                            "physicalid": "D",
                            "rootToNode": "A-0:C-1:D-2",
                            "level": "2",
                            "attribute": "Spanish-spanish"
                        },
                        "children": []
                    };
thisContext.findAndUpdateNodeIterative(updatedNode.nodeData.rootToNode, updatedNode);
console.log(thisContext.treeViewData); // **not updated**

Требуется JS Структура кода,

// about 4000 lines are present in this module
define("CustomModule", ["fewModules"], function(fewModules) {
            var widget = {
                init: function() {
                    this.treeViewData = '';
                },
                // many methods are here
                update: function() {
                    var thisContext = this;
                    // rest api call brings the data nodesMap
                    for (let selectedObject of nodesMap.values()) {
                        // many lines
                        thisContext.findAndUpdateNodeIterative(updatedNode.nodeData.rootToNode, updatedNode);
                        console.log(thisContext.treeViewData); // not updated treeViewData
                    }
                }
            };
            return widget;
        }
...