双重for循环无法返回数据?为何get_item函数返回undefined而非count
为什么
get_item返回undefined而不是count? 这个问题的核心在于**forEach回调函数里的return无法让外层的get_item函数返回值**,它只能终止当前这一次的回调执行,根本影响不到外层函数的返回逻辑。
具体原因拆解:
- 当你在
forEach的匿名回调里写return item时,这个return的作用域仅限于这个回调函数本身——它只会跳出当前的回调循环,不会让外层的for...in停止,更不会让get_item函数直接返回item。 - 虽然控制台打印出了
a a,说明确实匹配到了目标值,但这个匹配后的return并没有触发get_item的返回逻辑。后续的next和previous属性依然会被遍历,所以你还会看到b a和c a的输出。 - 整个
get_item函数没有任何顶层的return语句,所以函数执行完毕后会默认返回undefined。
解决方法
既然forEach不适合这种需要中断遍历并返回结果的场景,我们可以换成以下两种方式:
方式1:使用普通for循环替代forEach
普通循环里的return可以直接作用到外层函数,一旦匹配到目标就会立即终止所有遍历并返回结果:
var a = { count: [{label:'a', value: 'a'}], next: [{label:'b', value: 'b'}], previous: [{label:'c', value: 'c'}], } function get_item() { var x = "a" for (let item in a){ // 用for...of遍历数组 for (const obj of a[item]) { console.log(obj.value, x ) if(obj.value === x) { return item } } } } console.log(get_item()) // 输出:count
方式2:利用Array.some()中断遍历
some()方法会在回调返回true时立即终止遍历,我们可以配合一个变量保存结果,再终止外层的for...in循环:
var a = { count: [{label:'a', value: 'a'}], next: [{label:'b', value: 'b'}], previous: [{label:'c', value: 'c'}], } function get_item() { var x = "a" let result; for (let item in a){ const isFound = a[item].some(obj => { console.log(obj.value, x ) if(obj.value === x) { result = item; return true; // 终止some遍历 } return false; }) if(isFound) break; // 终止外层for...in } return result; } console.log(get_item()) // 输出:count
总的来说,forEach更适合单纯的遍历执行操作,如果你需要在遍历中找到匹配项就终止并返回结果,普通循环或者some/find这类支持中断的方法会更合适。
内容的提问来源于stack exchange,提问作者sof-03
相关产品推荐
相关产品推荐

