javascript - 嵌套对象的递归函数返回未定义
问题描述
我正在遍历对象的嵌套对象,寻找一个特定的对象,如果我找到它,我会做一些事情。我可以让它为第一个嵌套工作,但之后的任何嵌套我都会得到一个未定义的值。
let myObj = [{
id: 1,
children: [{
id: 1.1,
children: []
},
{
id: 1.2,
children: []
}
]
},
{
id: 2,
children: [{
id: 2.1,
children: []
},
{
id: 2.2,
children: []
}
]
}
]
function addToObj(itemToAdd, parentId, obj) {
for (let i = 0; i < obj.length; i++) {
const item = search(obj[i], parentId);
console.log(item); // undefined
if (item) {
item.children = item.children.concat(itemToAdd);
break;
}
}
function search(obj, id) {
if (obj.id === id) {
console.log(obj); // defined (obj with id of 2.1), but returns undefined?
return obj;
}
for (let i = 0; i < obj.children.length; i++) {
search(obj.children[i], id);
}
}
return obj;
};
const itemToAdd = {
id: 100,
}
addToObj(itemToAdd, 2.1, myObj);
上述代码段中的函数循环遍历对象,查找特定项目。如果它找到该项目,它会将一个对象插入到该项目的子属性中。
解决方案
您需要使用递归的返回值search
:如果存在,则返回它:
for (let i = 0; i < obj.children.length; i++) {
const possibleResult = search(obj.children[i], id);
if (possibleResult) {
return possibleResult;
}
}
let myObj = [{
id: 1,
children: [{
id: 1.1,
children: []
},
{
id: 1.2,
children: []
}
]
},
{
id: 2,
children: [{
id: 2.1,
children: []
},
{
id: 2.2,
children: []
}
]
}
]
function addToObj(itemsToAdd, parentId, obj) {
for (let i = 0; i < obj.length; i++) {
const item = search(obj[i], parentId);
// first log here will be undefined, nothing found
// second log here will find the object
console.log('item', item);
if (item) {
item.children = item.children.concat(itemsToAdd);
break;
}
}
function search(obj, id) {
if (obj.id === id) {
console.log('obj', obj); // defined (obj with id of 2.1), but returns undefined?
return obj;
}
for (let i = 0; i < obj.children.length; i++) {
const possibleResult = search(obj.children[i], id);
if (possibleResult) {
return possibleResult;
}
}
}
return obj;
};
const itemToAdd = {
id: 100,
}
addToObj(itemToAdd, 2.1, myObj);
推荐阅读
- python - 使用 SimpleElastix 手动注册
- javascript - 从包含关键字的列表中删除条目 - nodeJS
- oracle - Oracle DB 仅在数据存在时创建表
- octobercms - 在 forceDelete() 上删除模型的文件附件 - OctoberCMS
- python - 如何使用matplotlib在x轴上绘制包含日期时间对象列表的字典值的时间线图?
- sql-server - 为 SQL 中的所有可空列设置 NULL
- mysql - MySql Sum 如果条件满足 Group By
- javascript - 如何在 Angular 中的 httpClient 调用中产生错误?
- javascript - 使用 JavaScript 检查元素是否具有特定的 CSS 属性
- java - 在junit中一起使用2个RunWith()