【发布时间】:2018-07-02 04:35:42
【问题描述】:
我有一个这样的对象,我想通过 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);
}
}
}
};
【问题讨论】:
-
提示:遍历整个树一次,并通过它们的 id 将所有节点存储在一个对象中。这使得通过 id 进一步查找一个简单的
node = nodesById[id] -
@Thomas 我在我的问题 (findObjectById) 中添加了一个新函数,它的作用与您提到的完全相同,但它不起作用,我不知道出了什么问题。
标签: javascript object search