我使用此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;尺寸&#34;:["34", "36", "38"...]
。
remData.size
是&#34; size&#34;我正在寻找(例如&#34; 36&#34;)。
如果I&#39; m搜索的大小在索引中,我需要返回索引i
。否则我需要返回-1
。有更好的方法吗?
答案 0 :(得分:148)
要在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
(找到条目本身),两者都可以是填充/填充:
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
在回调第一次返回truthy值时停止,将该调用的索引返回给回调;如果回调永远不会返回真值,则返回-1
。 Array#find
在找到您要查找的内容时也会停止,但会返回该条目,而不是其索引(如果回调永远不会返回真值,则返回undefined
。)
如果您使用的是与ES5兼容的环境(或ES5垫片),则可以在数组上使用新的some
function,这会调用回调,直到回调返回真值:
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
}
});
答案 1 :(得分:10)
逻辑错误。它总是会返回数组中最后一个元素的结果。
remIndex = -1;
for (i = 0; i < remSize.length; i++) {
if (remSize[i].size == remData.size) {
remIndex = i
break;
}
}
答案 2 :(得分:8)
用于循环而不是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);
}
答案 3 :(得分:0)
我知道这有点老,但是与其使用for循环遍历数组,不如使用方法<array>.indexOf(<element>[, fromIndex])
它遍历数组,查找并返回值的第一个索引。如果该值未包含在数组中,则返回-1。
<array>
是要遍历的数组,<element>
是要查找的值,[fromIndex]
是要从其开始的索引(默认为0)。
我希望这有助于减少代码的大小!