JavaScript for döngüsü nasıl durdurulur?


128

Bu JavaScript'i bir dizide yineleme yapmak ve eşleşen bir dizi öğesi bulmak için kullanıyorum:

var remSize = [], 
    szString, remData, remIndex, i;

for (i = 0; i < remSize.length; i++) {      
    // I'm looking for the index i, when the condition is true
    remSize[i].size == remData.size ? remIndex = i : remIndex = -1;     
}

Dizi bu "boyutlarını" içerir: ["34", "36", "38"...].

remData.size aradığım "boyut" (örneğin, "36").

Aradığım iboyut dizindeyse dizini döndürmem gerekiyor . Aksi takdirde geri dönmem gerekiyor -1. Bunu yapmanın daha iyi bir yolu var mı?

Yanıtlar:


194

forJavaScript'te bir döngüyü erken durdurmak için şunları kullanırsınız break:

var remSize = [], 
    szString,
    remData,
    remIndex,
    i;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // Set a default if we don't find it
for (i = 0; i < remSize.length; i++) {      
     // I'm looking for the index i, when the condition is true
     if (remSize[i].size === remData.size) {
          remIndex = i;
          break;       // <=== breaks out of the loop early
     }
}

Bir ES2015 (ES6 olarak da bilinir) ortamındaysanız, bu özel kullanım durumu için, Array#findIndex(girişin dizinini bulmak için) veya Array#find(girişin kendisini bulmak için) kullanabilirsiniz; her ikisi de parlatılabilir / çoklu doldurulabilir:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = remSize.findIndex(function(entry) {
     return entry.size === remData.size;
});

Array#find:

var remSize = [], 
    szString,
    remData,
    remEntry;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remEntry = remSize.find(function(entry) {
     return entry.size === remData.size;
});

Array#findIndexgeri arama ilk kez doğru bir değer döndürdüğünde durdurur ve bu çağrı için dizini geri aramaya döndürür; Döndürdüğü -1geri arama asla bir truthy değeri verirse. Array#findaradığınız şeyi bulduğunda da durur, ancak indeksini değil girdiyi döndürür (veya undefinedgeri arama hiçbir zaman gerçek bir değer döndürmezse).

ES5 uyumlu bir ortam (veya bir ES5 dolgusu) kullanıyorsanız, diziler üzerinde geri arama doğru bir değer döndürene kadar bir geri aramayı çağıran yeni someişlevi kullanabilirsiniz :

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
remSize.some(function(entry, index) {
    if (entry.size === remData.size) {
        remIndex = index;
        return true; // <== Equivalent of break for `Array#some`
    }
});

JQuery kullanıyorsanız, jQuery.eachbir dizide döngü yapmak için kullanabilirsiniz ; bu şuna benzer:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
jQuery.each(remSize, function(index, entry) {
    if (entry.size === remData.size) {
        remIndex = index;
        return false; // <== Equivalent of break for jQuery.each
    }
});

1
return ifadesini kullanmak iyi bir yaklaşımdır. Teşekkürler @TJ Crowder
techloris_109

@TJ Crowder hangi ifade iyi bir yaklaşımdır: yanlış mı döndürmek yoksa kırmak mı?
Ilyas karim

3
@Ilyaskarim: Kullandığınız yapıya uygun olanı kullanıyorsunuz ( breakbir fordöngü içinde, return falseiçinde jQuery.each, return trueiçinde some, ...).
TJ Crowder

13

Bunun yerine, ES2015 sürümünün bir parçası olan döngü için kullanın. ForEach'in aksine, return, break ve continue kullanabiliriz. Bkz. Https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/

let arr = [1,2,3,4,5];
for (let ele of arr) {
  if (ele > 3) break;
  console.log(ele);
}

es6'nın iyi kullanımı, bence buradaki en iyi cevaplardan biri
Emad Salah

Gerçekten de, buradaki en iyi cevap olduğunu söyleyebilirim - bunu yapmanın en düzgün yolu (Mozilla Hacks'ın yanıttaki bağlantıda söylediği gibi, "dizi öğeleri arasında döngü yapmak için henüz en kısa, doğrudan sözdizimi"). ES6'ya giden tüm zorlu işi, elimizden geldiğince yeni özelliklerinden yararlanarak (ve bu süreçte kendimize fayda sağlayarak) geri ödemeliyiz.
Velojet

10

Mantık yanlış. Her zaman dizideki son elemanın sonucunu döndürür.

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}

0

Bunun biraz eski olduğunu biliyorum, ancak dizi boyunca bir for döngüsü ile döngü yapmak yerine, yöntemi kullanmak çok daha kolay olurdu <array>.indexOf(<element>[, fromIndex])

Bir dizi boyunca döngü yaparak bir değerin ilk dizinini bulur ve döndürür. Değer dizide yer almıyorsa -1 döndürür.

<array>bakılacak dizidir <element>, aradığınız değerdir ve [fromIndex]başlanacak dizindir (varsayılan değer 0'dır).

Umarım bu, kodunuzun boyutunu küçültmenize yardımcı olur!


1
Bu başlık soruya cevap vermez: How to stop a JavaScript for loop?O does cevap / a maçın endeksi dönmek için -1 hiçbiri eğer daha iyi bir yolu var mı .
greybeard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.