1. ホーム
  2. javascript

[解決済み] JavaScriptのforループを止めるには?

2022-03-07 12:32:21

質問

私はこの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 . 何か良い方法はないでしょうか?

どのように解決するのですか?

を停止するには for JavaScript では、ループを早期に終了させるには 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
    }
});