Как остановить JavaScript для цикла?

Я использую этот 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. Есть ли лучший способ сделать это?

Ответ 1

Чтобы остановить цикл for в начале JavaScript, вы используете break:

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

/* ...I assume there 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 (aka ES6), для этого конкретного варианта использования вы можете использовать Array#findIndex (чтобы найти индекс ввода) или Array#find (чтобы найти запись), причем оба из них можно закрепить/полилизовать:

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

/* ...I assume there 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 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 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 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
    }
});

Ответ 2

Логика неверна. Он всегда возвращал результат последнего элемента в массиве.

remIndex = -1;

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

Ответ 3

Вместо этого используется для цикла, который является частью выпуска ES2015. В отличие от 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;}
  else{console.log(ele);}
}