我正在寻找一种方法来停止underscore.js _.each()
方法的迭代,但无法找到解决方案。如果你做.each()
,jQuery return false
可能会中断。
有没有办法停止下划线每个()?
_([1,2,3]).each(function(v){
if (v==2) return /*what?*/;
})
答案 0 :(得分:264)
你不能脱离each
方法 - 它模仿本地forEach
方法的行为,而本机forEach
不提供逃避循环(除了抛出一个除外)。
但是,所有希望都不会丢失!您可以使用Array.every
方法。 :)
从该链接:
every
为数组中的每个元素执行一次提供的callback
函数,直到找到callback
返回false值的值。如果找到这样的元素,every
方法会立即返回false。
换句话说,你可以做这样复杂的事情(link to JSFiddle):
[1, 2, 3, 4].every(function(n) {
alert(n);
return n !== 3;
});
这会通过1
提醒3
,然后“突破”循环。
你正在使用underscore.js,所以你会很高兴得知它 提供every
方法 - 他们称之为every
,但就像那样链接提及,他们还提供了一个名为all
的别名。
答案 1 :(得分:69)
更新
_。找到会更好,因为它会在找到元素时突破循环:
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"}
答案 2 :(得分:15)
您可以查看_.some
而不是_.each
。
一旦谓词为真,_.some
就会停止遍历列表。
结果可以存储在外部变量中。
_.some([1, 2, 3], function(v) {
if (v == 2) return true;
})
答案 3 :(得分:6)
_([1,2,3]).find(function(v){
return v if (v==2);
})
答案 4 :(得分:3)
您无法破解下划线中的forEach
,因为它会模拟EcmaScript 5本机行为。
答案 5 :(得分:3)
也许你想要Underscore的any()或find(),它会在满足条件时停止处理。
答案 6 :(得分:3)
与其他答案一样,这是不可能的。 以下是关于下划线underscore issue #21
中断路器的注释答案 7 :(得分:2)
我相信如果你的数组实际上是一个对象,你可以使用空对象返回。
_.({1,2,3,4,5}).each(function(v){
if(v===3) return {};
});
答案 8 :(得分:2)
同样值得注意的是,每个循环都不能被打破 打破,改为使用_.find。
答案 9 :(得分:1)
更新
你可以通过在内部抛出错误并将其捕获到外面来“破解”:类似这样的事情:
try{
_([1,2,3]).each(function(v){
if (v==2) throw new Error('break');
});
}catch(e){
if(e.message === 'break'){
//break successful
}
}
这显然会对您的代码在循环中触发的任何其他异常产生一些影响,因此请谨慎使用!
答案 10 :(得分:0)
在我的案例中工作
var arr2 = _.filter(arr, function(item){
if ( item == 3 ) return item;
});