如何在.forEach循环中模拟“中断”?

时间:2016-02-25 10:52:56

标签: javascript typescript

这是我想做的。然而,forEach中没有“继续”。

    var que = null
    self.qs.forEach((q) => {
        if (q.synchronized == false) {
            que = q;
            break; // I would like to do this
        }
    });
    //  Now que would be set to the first not synchronized

任何人都可以告诉我如何做到这一点。请注意,我使用的是最新的浏览器。请注意我只在数组中查找一个对象,其中synchronized == true。对不起,我之前在我的问题中使用了“继续”。我正在寻找的功能是“休息”。

3 个答案:

答案 0 :(得分:1)

使用Array.prototype.find();

que = self.qs.find((q, i) =>  q.synchronized === true);
  

描述

     

find方法对数组中存在的每个元素执行一次回调函数,直到找到一个回调返回true值的元素。 如果找到这样的元素,find会立即返回该元素的值。 否则,find返回undefined。仅为已分配值的数组的索引调用回调;对于已删除或从未分配过值的索引,不会调用它。

var self = {
    "qs": [{
      synchronized: false,
      a: "b"
    }, {
      synchronized: true,
      xyz: "abc"
    }, {
      synchronized: true,
      xyz: "abc"
    }, {
      synchronized: true,
      xyz: "abc"
    }]
  },
  que = self.qs.find(function(q, i, arr) {
    console.log(i);
    return q.synchronized === true
  });

document.write(JSON.stringify(que, 0, 4));

答案 1 :(得分:1)

MDN page on forEach有这样说:

  

注意:除了抛出异常之外,无法停止或中断forEach()循环。 如果你需要这样的行为,.forEach()方法是错误的工具,而是使用普通循环。如果要测试谓词的数组元素并需要布尔返回值,则可以使用every()或some()代替。

(我的重点)

我认为,鉴于您要求只找到第一个条目,为什么不使用一个简单的循环:

var que = null
for (var i = 0; i < self.qs.length; i++)
{
    if (!self.qs[i].synchronized) {
        que = self.qs[i];
        break;
    }
}

简单,直接且易于理解未来代码维护者的具体内容。仅仅因为我们有forEachsomereduce之类的花哨功能并不意味着您必须在每种情况下使用它们。

答案 2 :(得分:0)

您可以使用Array.prototype.some

简短形式:

self.qs.some((q) => {
   return (q.synchronized == false) && (que = q, true);
});

或:

self.qs.some((q) => {
   if (q.synchronized == false)
   {
      que = q;
      return true;
   }
});

或:

self.qs.some(q => (q.synchronized == false) && (que = q, true));

Array.prototype.some返回第一个返回true的结果。

Array.prototype.every返回第一个返回false的结果。

它们基本上是测试:

  • some:至少有1个项目返回true
  • 每个:每个项目都返回真实

您可以在此处滥用此内容: - )

第三个例子是一些JS-fu但是生成一个很好的oneliner ^ _ ^

完整代码:

var que;
self.qs.some((q) => {
   if (q.synchronized == false)
   {
      que = q;
      return true;
   }
});
if (que) {
   // handle que here
}

未经优化的肮脏黑客:

您也可以使用reduce:

var que = self.qs.reduce((result, q) => {
    if (que != null) return result;
    return (q.synchronized == false) ? q : result;
}, null);
// js-fu version
var que = self.qs.reduce((result,q) => que || (q.synchronized == false ? q : que),null);

非常不优化,但它可以节省你定义一个变量......但它没有早期出现。