簡體   English   中英

在JS Object中按ID查找一個孩子並將其推送

[英]Find a child by id in JS Object and push to it

我有一個這樣的對象,我想通過ID查找一個孩子並將其推入一個新孩子。

{
'id': '234567869',
'name': 'Lao Lao',
'title': 'general manager',
'children': [{
    'id': '467876756634',
    'name': 'Bo Miao',
    'title': 'department manager'
}, {
    'id': '2345666078',
    'name': 'Su Miao',
    'title': 'department manager',
    'children': [{
        'id': '898735342',
        'name': 'Tie Hua',
        'title': 'senior engineer'
    }, {
        'id': '7697347548',
        'name': 'Hei Hei',
        'title': 'senior engineer',
        'children': [{
            'id': '123415640',
            'name': 'Pang Pang',
            'title': 'engineer'
        }, {
            'id': '1237450976',
            'name': 'Xiang Xiang',
            'title': 'UE engineer'
        }]
    }]
}, {
    'id': '6968756535',
    'name': 'Yu Jie',
    'title': 'department manager'
}, {
    'id': '236448654',
    'name': 'Chun Miao',
    'title': 'department manager'
}, {
    'id': '356898765',
    'name': 'Yu Tie',
    'title': 'department manager'
}]}

我想將一個孩子添加到ID為“ 898735342”或“ 234567869”的對象中。

我使用了此遞歸函數,但不起作用。 這應該在我們的對象中通過“ id”進行搜索,並將“ newObj”作為子對象推入該對象。

var newObj = {
    'id': '999999999',
    'name': 'new name',
    'title': 'new added child',
};

function findNodeAndUpdate(idToFind, bigObjectToSearch, newObj) {
    var i, currentChild, result;
    if (idToFind == bigObjectToSearch.id) {
        bigObjectToSearch.children.push(newObj);
        return true;
    } else {
        // Use a for loop instead of forEach to avoid nested functions
        // Otherwise "return" will not work properly
        for (i = 0; i < bigObjectToSearch.children.length; i += 1) {
            currentChild = bigObjectToSearch.children[i];
            // Search in the current child
            result = findNodeAndUpdate(idToFind, currentChild, newObj);
            // Return the result if the node has been found
            if (result !== false) {
                bigObjectToSearch.children.push(newObj);
                return true;
            }
        }
        // The node has not been found and we have no more options
        return false;
    }
}

另一個功能仍然無法使用:

function findObjectById(root, id) {
    if (root.id == id){
        return root;
    }
    if (root.children) {
        for (var k in root.children) {
            if (root.children[k].id == id) {
                return root.children[k];
            }
            else if (root.children.length) {
                return findObjectById(root.children[k], id);
            }
        }
    }
};

請嘗試以下代碼:

 var obj = { 'id': '234567869', 'name': 'Lao Lao', 'title': 'general manager', 'children': [{ 'id': '467876756634', 'name': 'Bo Miao', 'title': 'department manager' }, { 'id': '2345666078', 'name': 'Su Miao', 'title': 'department manager', 'children': [{ 'id': '898735342', 'name': 'Tie Hua', 'title': 'senior engineer' }, { 'id': '7697347548', 'name': 'Hei Hei', 'title': 'senior engineer', 'children': [{ 'id': '123415640', 'name': 'Pang Pang', 'title': 'engineer' }, { 'id': '1237450976', 'name': 'Xiang Xiang', 'title': 'UE engineer' }] }] }, { 'id': '6968756535', 'name': 'Yu Jie', 'title': 'department manager' }, { 'id': '236448654', 'name': 'Chun Miao', 'title': 'department manager' }, { 'id': '356898765', 'name': 'Yu Tie', 'title': 'department manager' }] }; var newObj = { 'id': '999999999', 'name': 'new name', 'title': 'new added child', }; function findNodeAndUpdate(idToFind, bigObjectToSearch, newObj) { var i, currentChild, result; if (idToFind == bigObjectToSearch.id) { bigObjectToSearch.children = bigObjectToSearch.children || []; bigObjectToSearch.children.push(newObj); return true; } else if (bigObjectToSearch.children) { for (i = 0; i < bigObjectToSearch.children.length; i += 1) { currentChild = bigObjectToSearch.children[i]; // Search in the current child if(findNodeAndUpdate(idToFind, currentChild, newObj)){ break; } } return false; } return false; } findNodeAndUpdate('898735342', obj, newObj); console.log(obj); 

要刪除obj,

function deleteNode(idToFind, bigObjectToSearch) {
    var i, currentChild, result;
    if (idToFind == bigObjectToSearch.id) {
        return true;
    } else if (bigObjectToSearch.children) {
        for (i = 0; i < bigObjectToSearch.children.length; i += 1) {
            currentChild = bigObjectToSearch.children[i];
            // Search in the current child
            if(deleteNode(idToFind, currentChild)){
                //delete bigObjectToSearch.children[i];
                bigObjectToSearch.children.splice(i,1);
                break;
            };
        }
        return false;
    }
    return false;
}

希望能幫助到你 :)

您可以使用以下代碼。

var searchObj = {
    'id': '234567869',
    'name': 'Lao Lao',
    'title': 'general manager',
    'children': [{
        'id': '467876756634',
        'name': 'Bo Miao',
        'title': 'department manager'
    }, {
        'id': '2345666078',
        'name': 'Su Miao',
        'title': 'department manager',
        'children': [{
            'id': '898735342',
            'name': 'Tie Hua',
            'title': 'senior engineer'
        }, {
            'id': '7697347548',
            'name': 'Hei Hei',
            'title': 'senior engineer',
            'children': [{
                'id': '123415640',
                'name': 'Pang Pang',
                'title': 'engineer'
            }, {
                'id': '1237450976',
                'name': 'Xiang Xiang',
                'title': 'UE engineer'
            }]
        }]
    }, {
        'id': '6968756535',
        'name': 'Yu Jie',
        'title': 'department manager'
    }, {
        'id': '236448654',
        'name': 'Chun Miao',
        'title': 'department manager'
    }, {
        'id': '356898765',
        'name': 'Yu Tie',
        'title': 'department manager'
    }]
};

function findNodeAndUpdate(bigObjectToSearch, idToFind, newObj) {
    if (idToFind) {
        findNodeAndUpdate.searchValue = idToFind;
    }
    if (newObj) {
        findNodeAndUpdate.pushValue = newObj;
    }
    if (isArray(bigObjectToSearch)) {
        traverseArray(bigObjectToSearch)
    } else if ((typeof bigObjectToSearch === 'object') && (bigObjectToSearch !== null)) {
        traverseObject(bigObjectToSearch)
    } else {

    }
}

function traverseArray(arr) {
    arr.forEach(function(data) {
        findNodeAndUpdate(data)
    })
}

function traverseObject(obj) {
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (key === "id" && obj[key] == findNodeAndUpdate.searchValue) {
                if (obj.hasOwnProperty("children")) {
                    obj.children.push(findNodeAndUpdate.pushValue);
                } else {
                    obj["children"] = [];
                    obj.children.push(findNodeAndUpdate.pushValue);

                }
                break;
            } else {
                findNodeAndUpdate(obj[key]);
            }
        }
    }
}

function isArray(o) {
    return Object.prototype.toString.call(o) === '[object Array]'
}
findNodeAndUpdate(searchObj, "898735342", {
    'id': '999999999',
    'name': 'new name',
    'title': 'new added child',
});

嘗試此操作,核心是循環,當您將對象作為參數傳遞時,無論函數或循環中的對象發生什么變化,都會改變函數外部的對象,這是最重要的

let oldObj = {
    "id": "234567869",
    "name": "Lao Lao",
    "title": "general manager",
    "children": [{
        "id": "467876756634",
        "name": "Bo Miao",
        "title": "department manager"
    }, {
        "id": "2345666078",
        "name": "Su Miao",
        "title": "department manager",
        "children": [{
            "id": "898735342",
            "name": "Tie Hua",
            "title": "senior engineer"
        }, {
            "id": "7697347548",
            "name": "Hei Hei",
            "title": "senior engineer",
            "children": [{
                "id": "123415640",
                "name": "Pang Pang",
                "title": "engineer"
            }, {
                "id": "1237450976",
                "name": "Xiang Xiang",
                "title": "UE engineer"
            }]
        }]
    }, {
        "id": "6968756535",
        "name": "Yu Jie",
        "title": "department manager"
    }, {
        "id": "236448654",
        "name": "Chun Miao",
        "title": "department manager"
    }, {
        "id": "356898765",
        "name": "Yu Tie",
        "title": "department manager"
    }]
};

let result = {
    "id": "234567869",
    "name": "Lao Lao",
    "title": "general manager",
    "children": [{
        "id": "467876756634",
        "name": "Bo Miao",
        "title": "department manager"
    }, {
        "id": "2345666078",
        "name": "Su Miao",
        "title": "department manager",
        "children": [{
            "id": "898735342",
            "name": "Tie Hua",
            "title": "senior engineer"

        }, {
            "id": "7697347548",
            "name": "Hei Hei",
            "title": "senior engineer",
            "children": [{
                "id": "123415640",
                "name": "Pang Pang",
                "title": "engineer"
            }, {
                "id": "1237450976",
                "name": "Xiang Xiang",
                "title": "UE engineer"
            }]
        }]
    }, {
        "id": "6968756535",
        "name": "Yu Jie",
        "title": "department manager"
    }, {
        "id": "236448654",
        "name": "Chun Miao",
        "title": "department manager"
    }, {
        "id": "356898765",
        "name": "Yu Tie",
        "title": "department manager"
    }, {
        'id': '999999999',
        'name': 'new name',
        'title': 'new added child',
    }]
};

var newObj = {
    'id': '999999999',
    'name': 'new name',
    'title': 'new added child',
};

function findIdAppendObj(newObj, oldObj, idToFind) {

    if (oldObj.id === idToFind) {

        if (oldObj.children) {
            oldObj.children.push(newObj);
        } else {
            oldObj.children = [newObj];
        }

        return oldObj;

    } else {
        if (oldObj.children) {
            oldObj.children.forEach(function(child) {
                findIdAppendObj(newObj, child, idToFind);
            });
        }
    }

    return oldObj;

}

let testResult = findIdAppendObj(newObj, oldObj, '234567869');
console.log(JSON.stringify(testResult) === JSON.stringify(result));

我在問題(findObjectById)中添加了一個新功能,該功能與您提到的功能完全相同

不完全是

但它不起作用,我不知道出了什么問題。

在這種情況下, root.children.length始終為true ,因此您在返回之前永遠不會越過第一個孩子。

但是我的意思更像是這樣:

let root = //...
let nodesById = Object.create(null);

//map nodes by id
(function traverse(node){
  nodesById[id] = node;
  if(node.children)
    node.children.forEach(traverse);
})( root );

然后您的查詢歸結為

function findObjectById(id) {
  return nodesById[id];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM