如何停止JavaScript for循环?

fre*_*ent 113 javascript for-loop

我正在使用这个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;     
}
Run Code Online (Sandbox Code Playgroud)

该数组包含这些"大小":["34", "36", "38"...].

remData.size 是我正在寻找的"大小"(例如"36").

i如果我正在搜索的大小在索引中,我需要返回索引.否则我需要回来-1.有一个更好的方法吗?

T.J*_*der 165

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
     }
}
Run Code Online (Sandbox Code Playgroud)

如果您在ES2015(也称为ES6)环境中,对于此特定用例,您可以使用Array#findIndex(查找条目的索引)或Array#find(查找条目本身),这两者都可以是shimmed/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;
});
Run Code Online (Sandbox Code Playgroud)

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;
});
Run Code Online (Sandbox Code Playgroud)

Array#findIndex在第一次回调返回truthy值时停止,将该调用的索引返回给回调; -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`
    }
});
Run Code Online (Sandbox Code Playgroud)

如果你正在使用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
    }
});
Run Code Online (Sandbox Code Playgroud)

  • @Ilyaskarim:你使用适合你正在使用的构造的那个(在`for`循环中``break`,在'jQuery.each`中``return false`,在`some`中``return`,...) . (3认同)
  • 使用 return 语句是一个好方法。谢谢@TJ克劳德 (2认同)

ami*_*t_g 10

逻辑是不正确的.它总是返回数组中最后一个元素的结果.

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 10

用于循环而不是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);
}
Run Code Online (Sandbox Code Playgroud)