Как остановить цикл JavaScript for?
я использую этот 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
. Есть ли лучший способ сделать это?
3 ответа:
чтобы остановить a
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 (aka ES6), для этого конкретные use case, вы можете использовать
Array#findIndex
(найти индекс записи) илиArray#find
(найти саму запись), оба из которых могут быть обернуты/polyfilled: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
если callback-функция не возвращает значение ИСТИНА.Array#find
также останавливается, когда он находит то, что вы ищете, но он возвращает запись, а не его индекс (илиundefined
если callback-функция не возвращает значение ИСТИНА).если вы используете 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 } });
логика неверная. Он всегда будет возвращать результат последнего элемента в массиве.
remIndex = -1; for (i = 0; i < remSize.length; i++) { if (remSize[i].size == remData.size) { remIndex = i break; } }
используйте для цикла вместо этого, который является частью выпуска 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; console.log(ele); }