我正在遍历对象的嵌套对象,寻找一个特定的对象,如果找到了,我就会做。我可以使它在第一个嵌套中起作用,但是在此之后的任何嵌套中,我都得到一个未定义的值。
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);
以上代码片段中的函数在对象中循环查找特定项目。如果找到该项目,它将在该项目的子项属性中插入一个对象。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:1)
您需要使用递归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);
答案 1 :(得分:1)
代码中有两个问题
(obj.id === id)
是false
,那么在循环中您什么也不返回。obj.children
是否存在。
let myObj = [
{
id: 1,
children: [
{
id: 1.1,
children: []
},
{
id: 1.2,
children: []
}
]
},
{
id: 2,
children: [
{
id: 2.1,
children: []
},
{
id: 2.2,
children: []
}
]
}
]
There are two problems in code:
- List item
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;
}
if(obj.children){
for (let i=0;i<obj.children.length;i++) {
let x = search(obj.children[i], id);
if(x) return x;
}
}
}
return obj;
};
const itemToAdd = {
id: 100,
}
addToObj(itemToAdd, 2.1, myObj);