如何停止JavaScript for循环?
我正在使用这个JavaScript遍历一个数组,并find一个匹配的数组元素:
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”)。
如果我正在search的大小在索引中,我需要返回索引。 否则,我需要返回-1
。 有一个更好的方法吗?
要在JavaScript中尽早停止for
循环,可以使用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
(查找条目本身),两者都可以被删除/ 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
在callbackArray#findIndex
第一次返回真值时停止,并返回该callback的索引; 如果callback从不返回真值,则返回-1
。 Array#find
当它find你正在查找的内容时也会停止,但是它返回的是entry,而不是它的索引(如果callback从不返回真值,则返回undefined)。
如果您使用的是与ES5兼容的环境(或ES5垫片),则可以在数组上使用新的some
函数 ,这些函数会调用callback函数 ,直到callback函数返回一个真值:
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;} else{console.log(ele);} }