如何打破underscore.js中的_.each函数

我正在寻找一种方法来停止underscore.js _.each()方法的迭代,但无法find解决scheme。 jQuery .each()可以打破,如果你确实return false

有没有办法停止下划线()?

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

你不能从each方法中断,它模拟原生的forEach方法的行为,原生的forEach不提供转义循环(除了抛出exception)。

但是,所有的希望不会丢失! 您可以使用Array.every方法。 🙂

从那个链接:

every对数组中存在的每个元素执行一次提供的callback函数,直到findcallback函数返回一个假的值。 如果find这样的元素,则every方法立即返回false。

换句话说,你可以像这样做一些复杂的事情( 链接到JSFiddle ):

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

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

你正在使用underscore.js,所以你会很高兴知道它确实提供了every一种方法 – 他们称之为every一种方法,但是当链接提到时,它们也提供了一个名为all的别名。

更新:

当find元素时,_.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停止遍历列表。 结果可以存储在一个外部variables中。

 _.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(),当条件满足时将停止处理。

像其他答案一样,这是不可能的。 下面是关于下划线下划线问题#21中断路器的注释

你不能在下划线中打破forEach ,因为它模仿了EcmaScript 5本地行为。

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

 _.({1,2,3,4,5}).each(function(v){ if(v===3) return {}; }); 

注意每个循环不能被打破 – 也可以使用_.find来打破。

http://underscorejs.org/#each

更新:

你实际上可以通过抛出一个错误并在外面捕获它来“打破”:例如:

 try{ _([1,2,3]).each(function(v){ if (v==2) throw new Error('break'); }); }catch(e){ if(e.message === 'break'){ //break successful } } 

这显然对你的代码在循环中触发的任何其他exception有一些影响,所以谨慎使用!

在我的情况下工作

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