[1,2,3].forEach(function(el) {
if(el === 1) break;
});
JavaScript'teki yeni forEach
yöntemini kullanarak bunu nasıl yapabilirim? Ben return;
, return false;
ve break
yöntemlerini denedim. breakçöküyor ve
return` yinelemeye devam etmekten başka bir şey yapmıyor.
ForEachiçinde yerleşik bir
break` yeteneği yoktur. Yürütmeyi kesmek için bir tür istisna atmanız gerekir. örn.
var BreakException = {};
try {
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) throw BreakException;
});
} catch (e) {
if (e !== BreakException) throw e;
}
JavaScript istisnaları pek hoş değildir. Eğer içinde gerçekten kırılma
yapmanız gerekiyorsa geleneksel bir for
döngüsü daha uygun olabilir.
Array#some
kullanınBunun yerine, Array#some
kullanın:
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
Bunun nedeni, dizi sırasına göre çalıştırılan geri çağrılardan herhangi biri true
değerini döndürdüğünde some
değerinin true
değerini döndürmesi ve diğerlerinin çalıştırılmasını kısa devre yaptırmasıdır.
some, tersi [
every][2] (
return falsedurumunda duracaktır) ve
forEach, eksik oldukları tarayıcılarda
Array.prototype`'a eklenmesi gereken ECMAScript Fifth Edition yöntemleridir.
Geri arama işlevi içinde false döndürmeye izin verdiği için jquery
'nin each
yöntemini kullanmayı düşünün:
$.each(function(e, i) {
if (i % 2) return false;
console.log(e)
})
Lodash kütüphaneleri ayrıca map/reduce/fold vb. ile zincirlenebilen takeWhile
yöntemini de sağlar:
var users = [
{ 'user': 'barney', 'active': false },
{ 'user': 'fred', 'active': false },
{ 'user': 'pebbles', 'active': true }
];
_.takeWhile(users, function(o) { return !o.active; });
// => objects for ['barney', 'fred']
// The `_.matches` iteratee shorthand.
_.takeWhile(users, { 'user': 'barney', 'active': false });
// => objects for ['barney']
// The `_.matchesProperty` iteratee shorthand.
_.takeWhile(users, ['active', false]);
// => objects for ['barney', 'fred']
// The `_.property` iteratee shorthand.
_.takeWhile(users, 'active');
// => []
Bu çözümü başka bir sitede buldum. forEach'i bir try / catch senaryosuna sarabilirsiniz.
if(typeof StopIteration == "undefined") {
StopIteration = new Error("StopIteration");
}
try {
[1,2,3].forEach(function(el){
alert(el);
if(el === 1) throw StopIteration;
});
} catch(error) { if(error != StopIteration) throw error; }
Daha fazla ayrıntı için: http://dean.edwards.name/weblog/2006/07/enum/