Как остановить цикл 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); }