我正在寻找一种方法来停止underscore.js中_.each()
方法的迭代,但是找不到解决方案。jQuery的.each()
可以通过执行return false
来中断循环。
有没有办法停止underscore each()的循环?
_([1,2,3]).each(function(v){
if (v==2) return /*what?*/;
})
我正在寻找一种方法来停止underscore.js中_.each()
方法的迭代,但是找不到解决方案。jQuery的.each()
可以通过执行return false
来中断循环。
有没有办法停止underscore each()的循环?
_([1,2,3]).each(function(v){
if (v==2) return /*what?*/;
})
你无法从each
方法中跳出,它模拟了本地forEach
方法的行为,而本地的forEach
不提供退出循环的方法(除非抛出异常)。
不过,希望并未全部破灭!您可以使用Array.every
方法。 :)
根据链接中的内容:
every
方法会对数组中的每个元素执行所提供的callback
函数,直到找到一个使callback
返回false的元素。如果找到这样的元素,则every
方法立即返回false。
换句话说,您可以像这样做(JSFiddle链接):
[1, 2, 3, 4].every(function(n) {
alert(n);
return n !== 3;
});
这将会弹出数字 1
到 3
, 然后"break"跳出循环。
您正在使用 underscore.js,所以您会高兴地知道它确实提供了一个 every
方法 - 它们称之为 every
,但正如链接中提到的那样,它们还提供了一个别名叫做 all
。
_.every()
或_.all()
方法 - 所以请使用Array.every()
。 - Philipp Kyeck_.each()
的下划线文档特别提到了您无法跳出循环,并建议您改用 _.find()
。[http://underscorejs.org/#each] - blatt更新:
使用 _.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
之前遍历列表。 - Fabien Quatravaux_.some
而不是_.each
。
一旦找到一个满足谓词的元素,_.some
就会停止遍历列表。
结果可以存储在外部变量中。_.some([1, 2, 3], function(v) {
if (v == 2) return true;
})
_([1,2,3]).find(function(v){
return v if (v==2);
})
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
}
}
这显然会对循环中代码触发的任何其他异常产生一些影响,因此请谨慎使用!
forEach
函数也没有提供此功能。 - Felix Klingeach
和闭包时,您需要先筛选列表。这样您就不必担心中途跳出循环的问题。一般来说,如果您需要提前结束迭代,可能有其他更好的方法可以实现。 - Rob Hruskaeach
闭包中退出)类似于 JavaScript。第一个问题链接:https://dev59.com/TXI-5IYBdhLWcg3wm5vN#1767046。第二个问题链接:https://dev59.com/tnA75IYBdhLWcg3w49UR。 - Rob HruskaArray.every
来模拟您想要的行为。 - aeskr