如何打破_。在underscore.js中的每个函数

我正在寻找一种方法来停止下划线.js _.each()方法的迭代,但找不到解决方案。如果你执行return false, jQuery .each()可能会崩溃。

是否有方法停止用下划线each()?

_([1,2,3]).each(function(v){
if (v==2) return /*what?*/;
})
143920 次浏览

你不能用下划线打断forEach,因为它模拟EcmaScript 5本机行为。

你不能脱离each方法——它模拟本机forEach方法的行为,并且本机forEach不提供转义循环(除了抛出异常)。

你可以使用Array.every方法。:)

从这个链接:

every对数组中的每个元素执行一次所提供的callback函数,直到找到其中callback返回假值的元素为止。如果找到这样的元素,every方法立即返回false。

换句话说,你可以这样做(链接到JSFiddle):

[1, 2, 3, 4].every(function(n) {
alert(n);
return n !== 3;
});

这将提醒13,然后“中断”循环。

你正在使用underscore.js,所以你会很高兴地了解到它提供了一个every方法——他们称之为every,但正如那个链接提到的,他们还提供了一个别名all

也许你需要使用下划线的any()或find(),它们在满足条件时将停止处理。

和其他答案一样,这是不可能的。 下面是关于下划线强调问题21

中的断路器的注释

我相信如果你的数组实际上是一个对象,你可以返回一个空对象。

_.({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
}
}

这显然会对您的代码在循环中触发的任何其他异常产生一些影响,因此请谨慎使用!

更新:

_。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

**老**

如果你想有条件地跳出循环,使用_。过滤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"}
_([1,2,3]).find(function(v){
return v if (v==2);
})
同样值得注意的是,每个循环不能被打破 Break,使用_。找到相反。< / p >

http://underscorejs.org/#each

你可以看看_.some而不是_.each。 一旦谓词为真,_.some将停止遍历列表。 结果可以存储在外部变量中
_.some([1, 2, 3], function(v) {
if (v == 2) return true;
})

看到http://underscorejs.org/#some

对我来说很有效

var arr2 = _.filter(arr, function(item){
if ( item == 3 ) return item;
});