[英]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.