我正在寻找一种方法来停止 underscore.js _.each()
方法的迭代,但找不到解决方案。如果您执行 return false
,jQuery .each()
可能会中断。
有没有办法停止下划线each()?
_([1,2,3]).each(function(v){
if (v==2) return /*what?*/;
})
forEach
函数也不提供此功能。
each
时(在大多数语言中),您希望首先过滤您的列表。这样你就不用担心脱离它了。一般来说,如果您需要从迭代中提前中断,您可能会采用不同的方式来完成它。
Array.every
来模拟您想要的行为。
您不能中断 each
方法 - 它模拟原生 forEach
方法的行为,原生 forEach
不提供转义循环(除了引发异常)。
但是,所有的希望都不会消失!您可以使用 Array.every
方法。 :)
从那个链接:
every 对数组中存在的每个元素执行一次提供的回调函数,直到找到一个回调函数返回 false 值。如果找到这样的元素,every 方法会立即返回 false。
换句话说,您可以像这样 (link to JSFiddle) 做一些复杂的事情:
[1, 2, 3, 4].every(function(n) {
alert(n);
return n !== 3;
});
这将通过 3
提醒 1
,然后“中断”出循环。
您正在使用 underscore.js,因此您会很高兴得知它确实提供了一个 every
方法——他们称之为 every
,但正如该链接所提到的,它们还提供了一个别名为 all
。
更新:
_.find 会更好,因为它会在找到元素时跳出循环:
var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}];
var count = 0;
var filteredEl = _.find(searchArr,function(arrEl){
count = count +1;
if(arrEl.id === 1 ){
return arrEl;
}
});
console.log(filteredEl);
//since we are searching the first element in the array, the count will be one
console.log(count);
//output: filteredEl : {id:1,text:"foo"} , count: 1
** 老的 **
如果您想有条件地跳出循环,请使用 _.filter api 而不是 _.each。这是一个代码片段
var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}];
var filteredEl = _.filter(searchArr,function(arrEl){
if(arrEl.id === 1 ){
return arrEl;
}
});
console.log(filteredEl);
//output: {id:1,text:"foo"}
_.find
完全按照要求执行:遍历列表,直到回调返回 true
。
您可以查看 _.some
而不是 _.each
。一旦谓词为真,_.some
就会停止遍历列表。结果可以存储在外部变量中。
_.some([1, 2, 3], function(v) {
if (v == 2) return true;
})
请参阅http://underscorejs.org/#some
_([1,2,3]).find(function(v){
return v if (v==2);
})
也许你想要 Underscore 的 any() 或 find(),它会在满足条件时停止处理。
您不能在下划线中打断 forEach
,因为它模拟 EcmaScript 5 原生行为。
我相信如果您的数组实际上是一个对象,您可以使用一个空对象返回。
_.({1,2,3,4,5}).each(function(v){
if(v===3) return {};
});
更新:
实际上,您可以通过在内部抛出错误并在外部捕获它来“中断”:如下所示:
try{
_([1,2,3]).each(function(v){
if (v==2) throw new Error('break');
});
}catch(e){
if(e.message === 'break'){
//break successful
}
}
这显然对您的代码在循环中触发的任何其他异常有一些影响,因此请谨慎使用!
在我的情况下工作
var arr2 = _.filter(arr, function(item){
if ( item == 3 ) return item;
});
不定期副业成功案例分享
_.every()
也没有_.all()
方法 - 所以坚持使用Array.every()
。every
的常见原因。所以要注意可读性。_.each()
的下划线文档专门说明了您无法跳出循环这一事实,并建议您改用_.find()
。 http://underscorejs.org/#each