2013-06-11 5 views
1

Если у вас есть:Как выйти из цикла forEach?

var some = [0,1,2,3]; 
_.forEach(some, function (val) { 
    if(val === 1) { 
     // this return does nothing 
     return; 
    } 
}); 

Глядя на underscore source вы можете выйти из forEach используя

var breaker = {}; 

Однако выключатель не выпущен в общественной сферы и, как представляется, внутренняя переменная.

+0

Нет причин для этого. Чтобы вырваться из цикла 'if (iterator.call (context, obj [key], key, obj) === breaker) return;' –

+0

Underscore будет использовать собственный 'forEach', когда это возможно, и вы не сможете вырваться, если вы выбрали исключение (уродливое!), используйте 'some', проверьте соответствующие http://stackoverflow.com/questions/2641347/how-to-short-circuit-array-foreach-like-calling-break – elclanrs

ответ

4

вы можете использовать некоторые вместо forEach, что остановит его при первом возвращении чего-то не фальшивого. Противоположность - это каждый(), где он останавливается, когда вы возвращаете что-то ложное.

Вам все равно придется передавать данные с помощью закрытия, так как .some() вернет true или false.

var some = [0,1,2,3]; 
_.some(some, function (val, index) { 
    if(val === 1) { 
     // this return does nothing 
     alert("exiting at step "+index+" from finding "+val); 
     return true; 
    } 

    alert("continuing at step "+index+" found "+val); 
}); 
+0

ok, я добавил еще один tattletale, так что вы можете увидеть его в действии ... – dandavis

+0

@ pure_code.mom 'some' может сломаться, потому что объект' breaker' от undescore доступен в лексической области 'some', тогда как' breaker' * не * в области видимости для любая функция, определяемая вашим кодом (вне библиотеки подчеркивания). – apsillers

+0

Это будет работать. 'some' позволяет вам выйти из функции, как только вы вернете правку, в то время как' forEach' этого не делает. – elclanrs

Смежные вопросы