JavaScript 奇怪的坑 – forEach 跳出循環 – return 居然失效了!?

差不多3個月前,在做 LeetCode 題目的練習時遇到有關 JS 的問題,怕自己忘掉就順手做個紀錄

就是這一題 ➡ Zyrastory-LeetCode#1338

事情的來由如下 (已擷取了部分程式碼)

有一段程式寫到對Array進行 forEach迴圈 ( Object.values 會回傳array )

    //2.order by values
    var k = Object.values(dict);
    k.sort();
    k = k.reverse();
    
    //3.find result
    var res = 0;
    k.forEach(function(s){
        if (s>mid)
        {                
            return res == 0 ? 1 : res+1;
        }
        else if (s<mid)
        {
            mid -= s;
            res +=1;
        }
        else    //s == mid
        {
            return res+1;
        }
    });
    return res;

想說明明邏輯上沒問題啊,怎麼會一直提交失敗

看看了好像都是跑到第23行才回傳

發生了什麼事!? 上面的if else 應該有return才對啊

確實挺神奇的,那讓我們用簡單的程式試試看

function test() {
    arr = ['apple','pineapple','orange','lemon'];

    arr.forEach(function(s){
        if(s=='apple')
        {
            return '蘋果';
        }
        else if(s=='orange')
        {
            return '橘子';
        }
    });
    return '廚餘桶';
}
k = test();

對…我們得到了【廚餘桶】 明明就應該是蘋果啊…再不濟給我橘子也好

這時候讓我們看向下 JS 的技術文件,找到了下面這段

除非是拋出異常,否則並沒有中止的辦法

什麼!!!?? 居然只有拋出異常才能中止,跟平常用的C#的foreach完全不一樣呢

所以最開始的問題還是回去用基本的for loop吧

//2.order by values
    var k = Object.values(dict);
    k.sort();
    k = k.reverse();
    
    //3.find result
    var res = 0;
    for (let i = 0; i < k.length; i++) {
        const s = k[i];
        
        if (s>mid)
        {                
            return res == 0 ? 1 : res+1;
        }
        else if (s<mid)
        {
            mid -= s;
            res +=1;
        }
        else    //s == mid
        {
            return res+1;
        }
    }
    
    return res;

改成這樣就可以正常return想要的值了

疑惑總算解開了,可以安心去睡覺了

之後有機會的話,再去研究下文件中說的 every( ) 跟 some( ) 吧


參考文章 :

🧡如果這篇文章有幫上你的一點點忙,那是我的榮幸

✅如有任何疑問,歡迎透過留言或messenger讓我知道 !

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *