Чтобы остановить 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
}
});
break
вfor
цикле,return false
вjQuery.each
,return true
вsome
, ...).Вместо этого используйте цикл for of, который является частью выпуска ES2015. В отличие от forEach, мы можем использовать return, break и continue. См. Https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/
источник
Логика неверная. Он всегда будет возвращать результат последнего элемента в массиве.
источник
Я знаю, что это немного устарело, но вместо того, чтобы перебирать массив с помощью цикла for, было бы намного проще использовать метод
<array>.indexOf(<element>[, fromIndex])
Он просматривает массив, находя и возвращая первый индекс значения. Если значение не содержится в массиве, возвращается -1.
<array>
это массив для просмотра,<element>
это значение, которое вы ищете, и[fromIndex]
это индекс, с которого следует начать (по умолчанию 0).Надеюсь, это поможет уменьшить размер вашего кода!
источник
How to stop a JavaScript for loop?
Это делает ответ Есть ли лучший способ вернуть индекс матча / -1 , если ни один .