[英]how to break the _.each function in underscore.js
我正在寻找一种方法来停止underscore.js _.each()
方法的迭代,但无法找到解决方案。 如果你return false
jQuery .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
,然后“断开”循环。
你正在使用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"}
您可以查看_.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);
})
像其他答案一样,这是不可能的。 以下是关于下划线下划线问题#21的断路器的评论
你不能在下划线中打破forEach
,因为它模拟了EcmaScript 5本机行为。
也许你想要Underscore的any()或find(),它会在满足条件时停止处理。
我相信如果你的数组实际上是一个对象,你可以使用一个空对象返回。
_.({1,2,3,4,5}).each(function(v){
if(v===3) return {};
});
值得注意的是,每个循环都不能被打破 - 要打破,请改用_.find。
更新:
实际上,您可以通过在内部抛出错误并将其捕获到外部来“破解”:类似这样的事情:
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;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.