如何停止 JavaScript for 循环?

IT技术 javascript for-loop
2021-01-15 19:28:50

我正在使用此 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有一个更好的方法吗?

5个回答

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(又名 ES6)环境中,对于此特定用例,您可以使用Array#findIndex(查找条目的索引)或Array#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;
});

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如果回调从不返回truthy值。Array#find当它找到你正在寻找的东西时也会停止,但它返回条目,而不是它的索引(或者undefined如果回调从不返回真值)。

如果您使用的是 ES5 兼容环境(或 ES5 shim),您可以在数组上使用新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
    }
});
使用 return 语句是一个很好的方法。谢谢@TJ克劳德
2021-03-23 19:28:50
@TJ Crowder 哪个语句是一个好方法:返回假还是中断?
2021-03-27 19:28:50
@Ilyaskarim:您使用适合您正在使用的构造的那个(breakfor循环中,return falsejQuery.eachreturn truesome,...)。
2021-04-12 19:28:50

使用 for of 循环代替它是 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);
}
事实上,我会说这是这里最好的答案 - 最简洁的方法(“最简洁、最直接的遍历数组元素的语法”,正如 Mozilla Hacks 在答案的链接中所说的那样)。我们应该通过尽可能利用 ES6 的新功能来回报 ES6 的所有辛勤工作(并在此过程中使自己受益)。
2021-03-13 19:28:50
很好地使用 es6,我认为这是这里最好的答案之一
2021-03-23 19:28:50

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

remIndex = -1;

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

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

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

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

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

这并没有回答标题问题:How to stop a JavaScript for loop?确实回答了Is there a better way to return the index of a match/-1 if none
2021-03-25 19:28:50
@greybeard 你是对的。它不回答标题然而,在正文中,OP 逐字询问:“有没有更好的方法来做到这一点?” 我在这里提供的方法完全完成了 OP 想要做的事情,避免了 XY 问题(要求解决问题 Y 以解决问题 X),并生成更短且更易于阅读的代码。虽然标题中的问题可能会导致问题的功能性解决方案,但它并不能直接解决问题。当问题与问题无关时,您通常应该解决问题,而不是回答问题。
2021-04-03 19:28:50

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

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