Як зупинити JavaScript для циклу?


128

Я використовую цей 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. Чи є кращий спосіб зробити це?

Відповіді:


194

Щоб зупинити 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
    }
});

1
використання твердження про повернення - хороший підхід. Дякую @TJ Crowder
techloris_109

@TJ Crowder, яке твердження є хорошим підходом: повернути помилкове чи перервати?
Ілляс карим

3
@Ilyaskarim: Ви використовуєте відповідний конструкції, яку ви використовуєте ( breakв forциклі, return falseв jQuery.each, return trueв some, ...).
TJ Crowder

13

Використовуйте для циклу, який є частиною випуску ES2015. На відміну від forEach, ми можемо використовувати повернення, перерву та продовження. Дивіться 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, використовуючи його нові функції, де можна (і отримати користь у цьому процесі).
Велоджет

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 , якщо жоден .
сіра борода
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.