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

2020/10/17 01:21 · javascript ·  · 0评论

我正在寻找一种方法来停止underscore.js_.each()方法的迭代,但是找不到解决方案。.each()如果这样做,jQuery可能会崩溃return false

有没有一种方法可以停止在下划线each()?

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

您不能脱离该each方法-它模拟了本机forEach方法的行为,并且本机forEach不提供转义循环(除了引发异常)。

但是,所有的希望并没有失去!您可以使用该Array.every方法。:)

从该链接:

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

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

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

这将1通过3发出警报,然后“跳出”循环。

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

也许您要使用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
  }
}

显然,这与代码在循环中触发的任何其他异常有关,因此请谨慎使用!

就我而言

var arr2 = _.filter(arr, function(item){
    if ( item == 3 ) return item;
});
本文地址:http://javascript.askforanswer.com/ruhezaiunderscore-jszhongpohuai_-eachhanshu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!