Làm thế nào để thoát khỏi các vòng lặp lồng nhau trong JavaScript?
Có cách nào để thoát khỏi các vòng lặp lồng nhau trong Javascript không?
//Write the links to the page.
for (var x = 0; x < Args.length; x++)
{
for (var Heading in Navigation.Headings)
{
for (var Item in Navigation.Headings[Heading])
{
if (Args[x] == Navigation.Headings[Heading][Item].Name)
{
document.write("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
break; // <---HERE, I need to break out of two loops.
}
}
}
}
Câu trả lời #1
Giống như Perl,
loop1:
for (var i in set1) {
loop2:
for (var j in set2) {
loop3:
for (var k in set3) {
break loop2; // breaks out of loop3 and loop2
}
}
}
như được định nghĩa trong EMCA-262 mục 12.12. [Tài liệu MDN]
Không giống như C, các nhãn này chỉ có thể được sử dụng cho continue và break, vì Javascript không có goto.
Câu trả lời #2
Đóng gói điều đó trong một hàm rồi chỉ cần return.
Câu trả lời #3
Tôi đến bữa tiệc hơi muộn nhưng sau đây là một phương pháp không phụ thuộc vào ngôn ngữ, không sử dụng GOTO/nhãn hoặc bao bọc hàm:
for (var x = Set1.length; x > 0; x--)
{
for (var y = Set2.length; y > 0; y--)
{
for (var z = Set3.length; z > 0; z--)
{
z = y = -1; // terminates second loop
// z = y = x = -1; // terminate first loop
}
}
}
Về mặt tích cực, nó chảy tự nhiên, điều này nên làm hài lòng những người không thích GOTO. Về mặt tiêu cực, vòng lặp bên trong cần hoàn thành vòng lặp hiện tại trước khi kết thúc, vì vậy nó có thể không áp dụng được trong một số tình huống.
Câu trả lời số 4
Tôi nhận ra đây là một chủ đề rất cũ, nhưng vì cách tiếp cận tiêu chuẩn của tôi chưa có ở đây, tôi nghĩ tôi sẽ đăng nó cho những người tìm kiếm trên Google trong tương lai.
var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
for (b = 0; b < 10 && !abort; b++) {
if (condition) {
doSomeThing();
abort = true;
}
}
}
Câu trả lời số 5
Khá đơn giản:
var a = [1, 2, 3];
var b = [4, 5, 6];
var breakCheck1 = false;
for (var i in a) {
for (var j in b) {
breakCheck1 = true;
break;
}
if (breakCheck1) break;
}
Câu trả lời số 6
Dưới đây là năm cách để thoát khỏi các vòng lặp lồng nhau trong JavaScript:
1) Đặt vòng lặp của cha mẹ vào cuối
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
{
i = 5;
break;
}
}
}
2) Sử dụng nhãn
exit_loops:
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
break exit_loops;
}
}
3) Sử dụng biến
var exit_loops = false;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
{
exit_loops = true;
break;
}
}
if (exit_loops)
break;
}
4) Sử dụng hàm tự thực thi
(function()
{
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
return;
}
}
})();
5) Sử dụng hàm thông thường
function nested_loops()
{
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
return;
}
}
}
nested_loops();
Câu trả lời #7
var str = "";
for (var x = 0; x < 3; x++) {
(function() { // here's an anonymous function
for (var y = 0; y < 3; y++) {
for (var z = 0; z < 3; z++) {
// you have access to 'x' because of closures
str += "x=" + x + " y=" + y + " z=" + z + "<br />";
if (x == z && z == 2) {
return;
}
}
}
})(); // here, you execute your anonymous function
}
Như thế nào? :)
Câu trả lời số 8
Thế còn việc không dùng bất kỳ điểm dừng nào, không cờ hủy, và không kiểm tra điều kiện bổ sung thì sao. Phiên bản này chỉ đơn giản là đặt tất cả các biến vòng lặp (làm cho chúng trở thành Number.MAX_VALUE) khi điều kiện được đáp ứng và buộc tất cả các vòng lặp kết thúc một cách gọn gàng.
// No breaks needed
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
if (condition) {
console.log("condition met");
i = j = Number.MAX_VALUE; // Blast the loop variables
}
}
}
Đã có một câu trả lời tương tự cho các vòng lặp lồng nhau kiểu giảm, nhưng điều này hoạt động cho các vòng lặp lồng nhau kiểu tăng mà không cần phải xem xét giá trị kết thúc của từng vòng lặp đối với các vòng lặp đơn giản.
Một ví dụ khác:
// No breaks needed
for (var i = 0; i < 89; i++) {
for (var j = 0; j < 1002; j++) {
for (var k = 0; k < 16; k++) {
for (var l = 0; l < 2382; l++) {
if (condition) {
console.log("condition met");
i = j = k = l = Number.MAX_VALUE; // Blast the loop variables
}
}
}
}
}
