繁体   English   中英

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

[英]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;
});

这将警告13 ,然后“断开”循环。

你正在使用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;
})

http://underscorejs.org/#some

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

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
  }
}

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

在我的情况下工作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM