如何停止JavaScript for循环?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

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

提问于
用户回答回答于

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垫片),则可以在阵列上使用新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;
    }
}

扫码关注云+社区