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

时间:2012-01-08 17:55:11

标签: javascript jquery underscore.js

我正在寻找一种方法来停止underscore.js _.each()方法的迭代,但无法找到解决方案。如果你做.each(),jQuery return false可能会中断。

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

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

11 个答案:

答案 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;
})

请参阅http://underscorejs.org/#some

答案 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。

http://underscorejs.org/#each

答案 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;
});