如何停止 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。还有更好的办法吗?

276784 次浏览

要在 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)环境中,对于这个 具体点用例,你可以使用 ArrayfindIndex(查找条目的索引)或者 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;
});

find在回调函数第一次返回真值时停止,返回回调函数返回真值的元素(如果回调函数从未返回真值,则返回 undefined) :

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;
});

当回调函数第一次返回真值时,findIndex停止,返回元素的索引而不是元素的索引; 如果回调函数从未返回真值,则返回 -1

如果使用 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 和 keep。参见 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);
}

我知道这有点老旧,但是与使用 for 循环遍历数组相比,使用 <array>.indexOf(<element>[, fromIndex])方法要容易得多

它循环遍历数组,查找并返回值的第一个索引。如果该值不包含在数组中,则返回 -1。

<array>是要查看的数组,<element>是要查找的值,[fromIndex]是要从中开始的索引(默认值为0)。

我希望这有助于减少代码的大小!

也可以使用 Javascript 的 every方法,当条件不为真时停止执行。

Https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/array/every

remIndex = -1;


remSize.every((rem, index) => {
if (rem.size == remData.size) {
remIndex = i
return false
}
return true
})