关于递归函数返回值的一些疑问

Aa狸烤鱼豆腐猫 2021-05-01 12:52:49

var data = [{
id: 1,
name: '电器',
goods: [{
id: 11,
name: '冰箱',
goods: [{
id: 111,
name: '海尔'
}]
}, {
id: 12,
name: '空调',
goods: [{
id: 121,
name: '格力'
}]
}]
}, {
id: 2,
name: '食品',
goods: [{
id: 21,
name: '薯片'
}]
}]

// 利用递归forEach()遍历数组内的的数据
function getID(product, id) {
var o = {}
product.forEach(function(item) {
if (item.id === id) {
o = item;
console.log(o)
} else if (item.goods && item.goods.length > 0) {
getID(item.goods, id)
}
})
return o;
}

console.log(getID(data, 121))

以上代码段中,第一个log正常输出,但是为何第二个log输出是一个空对象,正常不是进行getID(item.goods, id)递归之后item遍历到的符合的对象存储在了o这个空对象里面了吗,怎么打印出来是个{ }?(输出结果如下图所示)
...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 泡泡鱼_ 的回复:
[quote=引用 4 楼 Aa狸烤鱼豆腐猫 的回复:][quote=引用 1 楼 泡泡鱼_ 的回复:]因为你要操作的对象o定义在函数内部,,然后你每次getID时都会将其重置为{}
我大概明白了,是因为循环会走完它,每次走都会走到最后一个对象也就是名字为食品的那个对象,食品对象不符合查找的要求,没有执行if跟else if ,但是又递归重置了对象o。[/quote] 差不多,除非你要找的是1和2 而且因为Array.forEach一定会遍历完所有元素的特性。它也不适合用来这样子递归查找。它不会在找到目标后第一时间跳出。不如用经典的for循环来处理[/quote] 之所以用foreach也是因为最近刚学了js高级 所以打算运用一下,而且案例用的也是forEach()
泡泡鱼_ 2021-05-01
  • 打赏
  • 举报
回复
引用 4 楼 Aa狸烤鱼豆腐猫 的回复:
[quote=引用 1 楼 泡泡鱼_ 的回复:]因为你要操作的对象o定义在函数内部,,然后你每次getID时都会将其重置为{}
我大概明白了,是因为循环会走完它,每次走都会走到最后一个对象也就是名字为食品的那个对象,食品对象不符合查找的要求,没有执行if跟else if ,但是又递归重置了对象o。[/quote] 差不多,除非你要找的是1和2 而且因为Array.forEach一定会遍历完所有元素的特性。它也不适合用来这样子递归查找。它不会在找到目标后第一时间跳出。不如用经典的for循环来处理
  • 打赏
  • 举报
回复
引用 1 楼 泡泡鱼_ 的回复:
因为你要操作的对象o定义在函数内部,,然后你每次getID时都会将其重置为{}
我大概明白了,是因为循环会走完它,每次走都会走到最后一个对象也就是名字为食品的那个对象,食品对象不符合查找的要求,没有执行if跟else if ,但是又递归重置了对象o。
  • 打赏
  • 举报
回复
引用 1 楼 泡泡鱼_ 的回复:
因为你要操作的对象o定义在函数内部,,然后你每次getID时都会将其重置为{}
我其实就想知道为何第一层没被重置而第二层开始就会重置呢?
  • 打赏
  • 举报
回复
重置为0 之后不是又赋值了吗
 
if (item.id === id) {
                    o = item;
                    console.log(o)
                } else if (item.goods && item.goods.length > 0) {
                    getID(item.goods, id)
                }
泡泡鱼_ 2021-05-01
  • 打赏
  • 举报
回复
因为你要操作的对象o定义在函数内部,,然后你每次getID时都会将其重置为{}

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧