2017-09-29 128 views
-1

注:我想用forEach回調函數打破while()循環,不打破forEach本身。在while循環中打破array.forEach?

我目前正在試圖打破在foreach方法while循環中同樣while循環,但JavaScript不喜歡裏面的功能break語句。它吐出unsynctatic breakillegal break statement取決於環境。

我試圖做這樣的事情:

while(true) { 
    example = [false, false, true]; 
    example.forEach(function breakWhile(element) { 
     if(element) {break;} 
    }) 
} 

我知道,for...of(加上使用的while環標籤)解決了這個,但它真的是我唯一的出路?我很喜歡使用array.forEach。更糟糕的是,我可能想使用一個函數,而這個函數也被JS引擎忽略了。

+3

的可能的複製[如何短路Array.forEach就像說破?](https://stackoverflow.com/questions/2641347/how-to-short-circuit-array -foreach樣叫破) –

+0

@VoidRay不是真的,我想打破while()循環,而不是在foreach。 – Rafael

+0

有['every'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every)和['some'](HTTPS://顯影劑。 mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some),你應該在這裏使用,連同其他幾個['Array'](https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Array#Methods_2)方法。 – Xufox

回答

0

我覺得你最好的選擇就是使用的標誌。

let dobreak = false; 
 
while(!dobreak) { 
 
    example = [false, false, true, false]; 
 
    example.forEach(function breakWhile(element) { 
 
     if(element) {dobreak = true;} 
 
     else if(!dobreak) { 
 
      console.log(element); 
 
     } 
 
    }) 
 
}

另一個想法是創建一個函數來替換內置的forEach,在這裏,我把它叫做breakForEach如果迭代回調會打破在foreach內返回true,也會返回true,所以你可以打破這個時間。

你甚至可以將其添加到默認Array.prototype,但它是不可取的。

function breakForEach(arr, iter) { 
 
    for(let l = 0; l < arr.length; l ++) { 
 
    if (iter(arr[l])) return true;  
 
    } 
 
    return false; 
 
} 
 

 
while(true) { 
 
    var example = [false, false, true, false]; 
 
    if (breakForEach(example, function breakWhile(element) { 
 
     if(element) return true; 
 
     console.log(element); 
 
    })) break; 
 
}

+0

嗯。這不完全是我所希望的(「打破」更清晰),但這確實是一個解決方案。在接受這個之前,會稍微等待一些可能的更好的解決方案,但至少要提供一個解決方案+1。 ;) – Rafael

+0

這是你經常得到的模式嗎?如果是這樣,你可以創建一個輔助函數。也許稱爲'whileForEachBreak'或類似的東西。 – Keith

+0

其實這是我第一次這樣做。 一個輔助函數也不會那麼幹淨,不僅僅是用forEach打破,但這似乎不是一種可能性。 – Rafael