如何打破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; });
这将提醒1
到3
,然后“断开”循环。
你正在使用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; })
_([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来打破。
更新:
你实际上可以通过抛出一个错误并在外面捕获它来“打破”:例如:
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; });