在javascript中,为什么在return语句内部为in循环执行后编写代码?
我的变量看起来像这样在javascript中,为什么在return语句内部为in循环执行后编写代码?,javascript,Javascript,我的变量看起来像这样 var widgets2 = [{ id: "1", title: 'title', children: [], }, { id: "2", title: 'title2', children: [] }, { id: "3", title: 'title3', children: [{ id: "4", title: 'title4', childr
var widgets2 = [{
id: "1",
title: 'title',
children: [],
},
{
id: "2",
title: 'title2',
children: []
},
{
id: "3",
title: 'title3',
children: [{
id: "4",
title: 'title4',
children: [],
}, {
id: "5",
title: 'title5',
children: [],
children: [{
id: "6",
title: 'title6',
children: [],
},
{
id: "7",
title: 'title7',
children: [],
}
]
}],
},
{
id: "9",
title: 'title9',
children: [],
}
]
function findTheKey(id,widget){
let newObj=[...widget];
for(var key in newObj){
if(newObj[key]['id']==id){
console.log(newObj[key])
return newObj[key];
}
console.log("came here")
if(newObj[key].hasOwnProperty("children")){
findTheKey(id,newObj[key].children);
}
}
}
函数代码如下所示
var widgets2 = [{
id: "1",
title: 'title',
children: [],
},
{
id: "2",
title: 'title2',
children: []
},
{
id: "3",
title: 'title3',
children: [{
id: "4",
title: 'title4',
children: [],
}, {
id: "5",
title: 'title5',
children: [],
children: [{
id: "6",
title: 'title6',
children: [],
},
{
id: "7",
title: 'title7',
children: [],
}
]
}],
},
{
id: "9",
title: 'title9',
children: [],
}
]
function findTheKey(id,widget){
let newObj=[...widget];
for(var key in newObj){
if(newObj[key]['id']==id){
console.log(newObj[key])
return newObj[key];
}
console.log("came here")
if(newObj[key].hasOwnProperty("children")){
findTheKey(id,newObj[key].children);
}
}
}
当使用以下代码调用函数时
var result=findTheKey(4,widgets2);
console.log(result)
结果是这样的
{id: "4", title: "title4", children: Array(0)}
came here
这意味着即使在执行了return语句,console.log被执行之后,任何帮助都将被高度赞赏。
谢谢你因为这是一个递归函数,返回的结果并没有你期望的效果,你需要一个递归函数之外的变量来保持你想要找到的东西的当前状态 例如,请参见下面的代码段:
var widgets2=[
{
id:“1”,
标题:“标题”,
儿童:[],
},
{
id:“2”,
标题:“标题2”,
儿童:[],
},
{
id:“3”,
标题:“标题3”,
儿童:[
{
id:“4”,
标题:“标题4”,
儿童:[],
},
{
id:“5”,
标题:“标题5”,
儿童:[],
儿童:[
{
id:“6”,
标题:“标题6”,
儿童:[],
},
{
id:“7”,
标题:“标题7”,
儿童:[],
},
],
},
],
},
{
身份证号码:“9”,
标题:“标题9”,
儿童:[],
},
];
让发现;
函数findTheKey(id,widget){
让newObj=[…小部件];
for(newObj中的var键){
if(newObj[key][“id”]==id){
found=newObj[key];
打破
}
if(newObj[key].hasOwnProperty(“子项”)){
findTheKey(id,newObj[key]。children);
}
}
发现退货;
}
var结果=找到键(4,widgets2);
控制台日志(结果)代码>您应该为此更新您的问题,但由于您在评论中提出了这一问题,因此我的建议如下
function findTheKey(id, widget) {
const newObj = [...widget];
for (const key in newObj) {
if (newObj[key]["id"] === `${id}`) {
return newObj[key];
}
if (newObj[key].hasOwnProperty('children')) {
/* Use the result of the recursive function */
const foundObject = findTheKey(id, newObj[key].children);
if(foundObject) return foundObject;
}
}
return false;
}
只有当if
语句为true时,才会执行return
语句。在到达条件返回语句之前,可以多次执行for循环。id为4的对象嵌套在子键中。您的循环正在检查这一点,当它为真时(您的第二个if语句),您将使用子数组再次调用findTheKey
方法。这就是所发生的->console.log('come here')->再次调用带有子数组的方法->找到ID并返回。@TobiasBoertz,有没有办法只需稍加修改即可获得所需的结果。我期望从函数中得到的是返回id为4的对象。如何确保在“result”变量中得到所需的结果?我已经更新了我的答案,你可以使用一个递归函数之外的变量来检查递归何时停止。