JavaScript forループを停止する方法は?


127

このJavaScriptを使用して配列を反復処理し、一致する配列要素を見つけています。

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;     
}

配列には次の「サイズ」が含まれています["34", "36", "38"...]

remData.size 私が探している「サイズ」です(例:「36」)。

i検索しているサイズがインデックス内にある場合、インデックスを返す必要があります。そうでなければ私は戻る必要があり-1ます。これを行うより良い方法はありますか?

回答:


193

forJavaScriptの早い段階でループを停止するには、次を使用します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
     }
}

ES2015(別名ES6)環境の場合、この特定の使用例では、Array#findIndex(エントリのインデックスArray#findを見つける)または(エントリ自体を見つける)を使用できます。どちらもシム/ポリフィルできます。

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#findIndexコールバックが真の値を初めて返したときに停止し、コールバックへのその呼び出しのインデックスを返します。-1コールバックが真の値を返さない場合に返されます。Array#find探しているものが見つかると停止しますが、インデックスではなくエントリを返します(またはundefinedコールバックが真の値を返さない場合)。

ES5互換環境(またはES5シム)を使用している場合は、配列で新しいsome関数を使用できます。これは、コールバックが真の値を返すまでコールバックを呼び出します。

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を使用jQuery.eachしている場合は、を使用して配列をループできます。これは次のようになります。

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ステートメントの使用は良いアプローチです。ありがとう@TJ Crowder
techloris_109

@TJ Crowderどのステートメントが良いアプローチですか:falseを返すか、それとも中断しますか?
Ilyas karim 2017年

3
@Ilyaskarim:あなたが使用している構築物1つの適切なを使用します(breakfor、ループreturn falsejQuery.eachreturn truesome、...)。
TJクラウダー2017年

13

代わりに、ES2015リリースの一部であるfor ofループを使用します。forEachとは異なり、return、break、continueを使用できます。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の良い使用、私はこれがここで最高の答えの一つだと思い
エマドサラ

確かに、私はそれがここでの最良の答えだと思います-それを行う最もおかしい方法です(「配列要素をループするためのまだ最も簡潔で直接的な構文」、Mozilla Hacksが答えのリンクで言っています)。私たちは、ES6に投入されたすべての困難な作業を、できる限りその新機能を利用して(そしてその過程で自分自身のために)返済する必要があります。
Velojet 2017

10

ロジックが正しくありません。常に配列の最後の要素の結果を返します。

remIndex = -1;

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

0

これは少し古いことを知っていますが、forループで配列をループする代わりに、メソッドを使用する方がはるかに簡単です。 <array>.indexOf(<element>[, fromIndex])

配列をループして、値の最初のインデックスを見つけて返します。値が配列に含まれていない場合は、-1を返します。

<array>は、検索する配列、検索する<element>値、および[fromIndex]開始するインデックスです(デフォルトは0)。

これがコードのサイズを減らすのに役立つことを願っています!


1
これは、タイトルの質問に答えていない:How to stop a JavaScript for loop?それはない答えを一致/ -1なしの場合の指数を返すために良い方法はあります
greybeard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.