242

Tôi có một vòng lặp foreach góc và tôi muốn thoát khỏi vòng lặp nếu tôi khớp với một giá trị. Các mã sau không hoạt động.

angular.forEach([0,1,2], function(count){
  if(count == 1){
    break;
  }
});

Làm thế nào tôi có thể nhận được điều này?

|
  • 1

    Tôi không hiểu tại sao bạn không chỉ tìm thấy giá trị thay vì đi vào một vòng lặp. Có thể ví dụ bạn đưa ra không kể toàn bộ câu chuyện, nhưng tôi muốn làm những gì @Aman nói dưới đây. Tại sao đi vào vòng lặp như được đề cập dưới đây và chạy kiểm tra mỗi khi một số () thực hiện chính xác điều đó theo cách thanh lịch hơn. Hãy nhớ rằng nếu bạn coi javascript là ngôn ngữ chức năng, sẽ không có điểm nào trong việc sử dụng các cấu trúc điều khiển for / while / break này. Đó là lý do tại sao foreach, find, some, v.v ... tồn tại

    – Nguyễn Lệ Huyền 23:30:09 02/11/2013
254

Không có cách nào để làm điều này. Xem https://github.com/angular/angular.js/issues/263 . Tùy thuộc vào những gì bạn đang làm, bạn có thể sử dụng boolean để không đi vào phần thân của vòng lặp. Cái gì đó như:

var keepGoing = true;
angular.forEach([0,1,2], function(count){
  if(keepGoing) {
    if(count == 1){
      keepGoing = false;
    }
  }
});
|
  • 1

    Tôi thà chỉ thêm một !keepGoing && return;vào đầu hàm, ít mã hơn.

    – Ngô Quốc Hưng 17:34:22 12/12/2012
  • 1

    Đây không phải là thực tiễn tốt nhất, ở đây vòng lặp forEach góc không bao giờ bị phá vỡ, VÀ không có gì để phá vỡ angular.forEach. Vòng lặp gốc nhanh hơn khoảng 90% so với angular.forEach. Vì vậy, tốt hơn là sử dụng vòng lặp gốc khi bạn muốn ngắt theo điều kiện khớp. Cảm ơn

    – Tạ Tấn Dũng 06:58:59 02/01/2014
  • 1

    @AndyJoslin Đây không phải là mã JavaScript hợp lệ.

    – Dương Minh Thi 18:01:42 11/02/2014
  • 1

    xcatly nơi tôi bị mắc kẹt ... và điều này đã giúp ... cảm ơn rất nhiều ... Dù sao tôi cũng muốn biết lý do khiến vòng lặp forEach không thể phá vỡ. Nếu có

    – Trịnh Hồng Hải 07:10:23 04/10/2015
285

Các angular.forEachvòng lặp không thể phá vỡ trên một trận đấu điều kiện.

Lời khuyên cá nhân của tôi là sử dụng vòng lặp NATIVE FOR thay vì angular.forEach.

Vòng lặp NATIVE FOR nhanh hơn khoảng 90% so với vòng lặp khác.

SỬ DỤNG vòng lặp CHO ANGULAR:

var numbers = [0, 1, 2, 3, 4, 5];

for (var i = 0, len = numbers.length; i < len; i++) {
  if (numbers[i] === 1) {
    console.log('Loop is going to break.'); 
    break;
  }
  console.log('Loop will continue.');
}
|
  • 1

    Điều này không làm việc cho tôi. Tất cả những gì nó làm là kết thúc vòng lặp đặc biệt này của vòng lặp. Nhưng sau đó nó chuyển sang lần lặp tiếp theo.

    – Ngô Quốc Hưng 14:03:20 01/01/2014
  • 1

    @Ben, Xin lỗi ben, Đó là sai lầm của tôi nhưng bây giờ tôi cập nhật câu trả lời của mình sau thời gian dài nghiên cứu. Tôi hy vọng điều này sẽ giúp bạn . Cảm ơn bạn

    – Tạ Tấn Dũng 06:55:20 02/01/2014
  • 1

    @LGama: - Trường hợp của bạn là gì ??

    – Dương Minh Thi 05:24:05 11/04/2014
  • 1

    jsperf.com/angular-foreach-performance kiểm tra nó trên trình duyệt của riêng bạn để quyết định bạn nên chọn chức năng nào. Tôi đã thử nghiệm trên IE11 và nó cũng nhanh như trong ảnh chụp màn hình. Cũng đã thử nghiệm Array.some () nhưng chậm hơn Array.forEach () trên IE11 nhưng có thể nhanh hơn angular.foreach ;-). Hoặc kiểm tra nó ở đây jsperf.com/angular-foreach-vs-native (tất cả các khoản tín dụng đi đến tác giả ban đầu, không phải là tôi ;-))

    – Trịnh Hồng Hải 09:07:49 29/07/2014
  • 1

    Ngay cả với jsperf, bạn không thể nói "bản địa cho nhanh hơn khoảng 90%". Trong kịch bản của bạn, điều này phụ thuộc rất nhiều vào việc thực thi hàm bên trong tốn kém như thế nào và có thể lưu bao nhiêu lần thực thi bằng cách thoát khỏi vòng lặp (ngắt) sớm.

    – Đặng Ðình Lộc 13:54:12 12/03/2015
22

vui lòng sử dụng một số hoặc mọi phiên bản của ForEach,

Array.prototype.some:
some is much the same as forEach but it break when the callback returns true

Array.prototype.every:
every is almost identical to some except it's expecting false to break the loop.

Ví dụ cho một số:

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.some(function (value, index, _ary) {
    console.log(index + ": " + value);
    return value === "JavaScript";
});

Ví dụ cho mọi:

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.every(function(value, index, _ary) {
    console.log(index + ": " + value);
    return value.indexOf("Script") > -1;
});

Tìm thêm thông tin
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/

|
  • 1

    không @ AngelS.Moreno, mọi người thích sử dụng biến cục bộ thay vì phương pháp được thiết kế riêng cho trường hợp trong tay

    – Ngô Ngọc Tú 13:33:03 11/05/2017
17

Sử dụng Array Một số phương thức

 var exists = [0,1,2].some(function(count){
      return count == 1
 });

tồn tại sẽ trả về true và bạn có thể sử dụng điều này như một biến trong hàm của mình

if(exists){
    console.log('this is true!')
}

Mảng một số phương pháp - Javascript

|
6

Cụ thể, bạn có thể thoát khỏi một forEachvòng lặp, và ở bất kỳ nơi nào, ném một ngoại lệ.

try {
   angular.forEach([1,2,3], function(num) {
      if (num === 2) throw Error();
   });
} catch(e) {
    // anything
}

Tuy nhiên, sẽ tốt hơn nếu bạn sử dụng thư viện khác hoặc thực hiện chức năng của riêng bạn, một findchức năng trong trường hợp này, vì vậy mã của bạn là cấp cao nhất.

|
6

Nếu bạn sử dụng jQuery (do đó không phải jqLite) kết hợp với AngularJS, bạn có thể lặp lại với $ .each - cho phép ngắt và tiếp tục dựa trên biểu thức giá trị trả về boolean.

Mã thông báo:

http://jsfiddle.net/JEcD2/1/

Javascript:

var array = ['foo', 'bar', 'yay'];
$.each(array, function(index, element){
    if (element === 'foo') {
        return true; // continue
    }
    console.log(this);
    if (element === 'bar') {
        return false; // break
    }
});

Chú thích:

Mặc dù sử dụng jQuery không phải là xấu, cả hai hàm Array.some hoặc Array.every đều được MDN khuyên dùng khi bạn có thể đọc tại tài liệu forEach gốc :

"Không có cách nào để dừng hoặc phá vỡ vòng lặp forEach. Giải pháp là sử dụng Array.every hoặc Array.some"

Các ví dụ sau được MDN cung cấp:

Mảng

function isBigEnough(element, index, array){
    return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true

Mảng.every:

function isBigEnough(element, index, array){
    return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
|
6

Theo như tôi biết, Angular không cung cấp chức năng như vậy. Bạn có thể muốn sử dụng find()chức năng gạch dưới cho việc này (về cơ bản là forEach sẽ thoát ra khỏi vòng lặp một khi chức năng trả về đúng).

http://underscorejs.org/#find

|
3

Thông thường không có cách nào để phá vỡ một vòng lặp "mỗi" trong javascript. Những gì có thể được thực hiện thường là sử dụng phương pháp "ngắn mạch".

    array.forEach(function(item) {
      // if the condition is not met, move on to the next round of iteration.
      if (!condition) return;

      // if the condition is met, do your logic here
      console.log('do stuff.')
    }

|
3

Như các câu trả lời khác, Angular không cung cấp chức năng này. Tuy nhiên, jQuery có và nếu bạn đã tải jQuery cũng như Angular, bạn có thể sử dụng

jQuery.each ( array, function ( index, value) {
    if(condition) return false; // this will cause a break in the iteration
})

Xem http://api.jquery.com/jquery.each/

|
2

Chỉ cần thêm chỉ mục $ và làm như sau:

angular.forEach([0,1,2], function(count, $index) {
     if($index !== 1) {
          // do stuff
     }
}
|
2

Hãy thử điều này như phá vỡ;

angular.forEach([0,1,2], function(count){
  if(count == 1){
    return true;
  }
});
|
2

Bạn có thể sử dụng điều này:

var count = 0;
var arr = [0,1,2];
for(var i in arr){
   if(count == 1) break;
   //console.log(arr[i]);
}
|
2

break không thể đạt được trong forEach góc, chúng ta cần sửa đổi forEach để làm điều đó.

$scope.myuser = [{name: "Ravi"}, {name: "Bhushan"}, {name: "Thakur"}];  
                angular.forEach($scope.myuser, function(name){
                  if(name == "Bhushan") {
                    alert(name);
                    return forEach.break(); 
                    //break() is a function that returns an immutable object,e.g. an empty string
                  }
                });
|
  • 1

    Câu trả lời này dường như không đầy đủ. Vui lòng cho biết liệu break()cần phải được xác định hoặc thời tiết đó là một phần của góc. Hãy xác định nếu không.

    – Trịnh An Khải 17:05:38 29/09/2016
1

Tôi sẽ sử dụng returnthay vì break.

angular.forEach([0,1,2], function(count){
  if(count == 1){
    return;
  }
});

Hoạt động như một lá bùa.

|
  • 1

    đây không phải là một giải pháp hợp lệ look: function test () {angular.forEach ([1,2,3,4,5,6,7,8,9], function (value, index) {if (value == 2) return; console.log (giá trị);})} đầu ra:> teste (); 1 3 4 5 6 7 8 9

    – Trịnh Minh Khuê 19:24:36 13/03/2019
1
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
var keepGoing = true;
ary.forEach(function(value, index, _ary) {
    console.log(index)
    keepGoing = true;
    ary.forEach(function(value, index, _ary) {
        if(keepGoing){ 
            if(index==2){
                keepGoing=false;
            }
            else{
                console.log(value)
            }

        }      
    });
});
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.