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

dy_*_*dy_ 200 javascript jquery underscore.js

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

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

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

aes*_*skr 266

你不能打破each方法 - 它模仿本机forEach方法的行为,并且本机forEach不提供转义循环(除了抛出异常).

但是,所有的希望都不会丢失!您可以使用该Array.every方法.:)

从该链接:

everycallback为数组中的每个元素执行一次提供的函数,直到找到一个callback返回false值的元素.如果找到这样的元素,则该every方法立即返回false.

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

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

这将提醒1通过3,然后"破发"出来的循环.

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

  • 这可行,但这是使用`every`的常见原因.所以要注意可读性. (3认同)
  • `_.each()`的下划线文档有一个特别说明你不能脱离循环的事实,并建议你使用`_.find()`.[http://underscorejs.org/#each](http://underscorejs.org/#each) (3认同)
  • underscore.js是否也为此提供了实现? (2认同)
  • 现在(05/2013),下划线中的数组既没有`_.every()`也没有`_.all()`方法 - 所以坚持使用`Array.every()`. (2认同)

Nik*_*hil 70

更新:

_.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
Run Code Online (Sandbox Code Playgroud)

**旧**

如果要有条件地跳出循环,请使用_.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"}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案应该标记为正确答案.`_.find`完全按照要求执行:迭代列表,直到回调返回`true`. (2认同)

小智 15

你可以看一下_.some而不是_.each. _.some一旦谓词为真,就会停止遍历列表.结果可以存储在外部变量中.

_.some([1, 2, 3], function(v) {
    if (v == 2) return true;
})
Run Code Online (Sandbox Code Playgroud)

http://underscorejs.org/#some


Roc*_*uby 6

_([1,2,3]).find(function(v){
    return v if (v==2);
})
Run Code Online (Sandbox Code Playgroud)