8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

短路 Array.forEach 类似于调用 break

j_random_hacker 2月前

177 0

[1,2,3].forEach(function(el) { if(el === 1) break;}); 如何使用 JavaScript 中的新 forEach 方法执行此操作?我尝试过 return;、return false; 和 break。break 崩溃,return 正常

[1,2,3].forEach(function(el) {
    if(el === 1) break;
});

我该如何使用 forEach JavaScript 中的新方法来实现这一点?我试过了 return; , return false; break . break 崩溃了, return 除了继续迭代什么也没做。

帖子版权声明 1、本帖标题:短路 Array.forEach 类似于调用 break
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由j_random_hacker在本站《validation》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 有一个简单的替代方法: for(const e of [1, 2, 3]){ if(e == 2){ break; } console.log(e) }

  • 没有内置的功能 break forEach 要中断执行,您必须抛出某种异常。例如。

    var BreakException = {};
    
    try {
      [1, 2, 3].forEach(function(el) {
        console.log(el);
        if (el === 2) throw BreakException;
      });
    } catch (e) {
      if (e !== BreakException) throw e;
    }

    JavaScript 异常并不那么优雅。 for 如果你确实需要,传统的循环可能更合适 break

    使用 Array#some

    相反,使用 Array#some :

    [1, 2, 3].some(function(el) {
      console.log(el);
      return el === 2;
    });

    这是有效的,因为 some 只要按数组顺序执行的任何回调 true 都会返回 true 从而短路其余回调的执行。

    some ,它的逆 every (将在 上停止 return false ),并且 forEach 如果缺少这些方法 Array.prototype ,则需要在浏览器中将其添加到 中

  • 您还可以尝试使用 ECMAScript2015 的新 for...of (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…),它可以完全满足您的要求,但缺点是此解决方案可能会导致旧版浏览器出现问题。如果您正在寻找支持数组以外的更多通用解决方案,您可以查看这样的解决方案 (github.com/nbouvrette/forEach),如果您愿意采用这种方式,它可以解决您的所有问题。

  • Array#some 的使用确实很棒。首先,它与大多数浏览器兼容,包括 ie9 和 Firefox 1.5,并且运行良好。我的示例用例是查找 ranges[a,b] 数组中的索引,其中数字位于下限和上限对之间,测试并在找到时返回 true。for..of 将是下一个最佳解决方案,但仅适用于较新的浏览器。

  • @frank 我写了一个只有一个循环结构的 esolang:forever。所有其他循环结构都是由 forever 和适当的可迭代异常组成的,例如 ContinueIteration 和 StopIteration(break 是一个要引发的宏)。一方面:never。另一方面:always。另一方面:sometimes?你评论中的 \'PERIOD\' 是否意味着可能有引文来支持你的建议?

  • @frank 这取决于语言。在 Python 中,使用异常处理来控制流程是完全可以接受的。事实上,出于这个原因,__next__() 在生成器耗尽后会引发 StopIteration,因为它通常是检测生成器结束的最佳方式 - 它比依赖魔法返回值要好得多。Python 的 ducktyping 和 EAFP 模式通常依赖异常处理作为流程控制机制。

  • 在 ECMAScript2015 (又名 ES6) 中,现在有更好的方法来实现这一点,即使用新的 for of 循环 。例如,此代码不会打印数字 5 之后的数组元素:

    const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    for (const el of arr) {
      console.log(el);
      if (el === 5) {
        break;
      }
    }

    来自文档:

    for ...in ...of 语句都会对某些内容进行迭代。它们之间的主要区别在于迭代的内容。for ...in 语句会按原始插入顺序迭代对象的可枚举属性。for for...of 语句会迭代可迭代对象定义的要迭代的数据。

    需要迭代中的索引?你可以使用 Array.entries() :

    for (const [index, el] of arr.entries()) {
      if ( index === 5 ) break;
    }
    
  • @superhero 您可以在 for...of 循环中获取元素的索引,只需使用entries。for (const [index, element] of someArray.entries()) { //... }

  • @emostafa 您说得对,不建议对数组使用 for in 循环,但这种方法实际上使用了 for of 循环。

  • 这是 \'for of\',这是一个非常干净的解决方案......但这也是 ES6 的功能,因此请注意,只有当您的环境设置为 ES6 时,它才会起作用。

  • 引用 12

    我发现自己经常使用这个解决方案,我也将它用于对象。对于对象,您可以执行 Object.entries(myObject),然后像使用 for..in 处理数组一样使用它。请注意,JS 数组在底层基本上是对象:blog.niftysnippets.org/2011/01/myth-of-arrays.html

  • 您可以使用 every 方法:

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

    ES6

    [1,2,3].every( el => el !== 1 )
    

    对于旧浏览器支持使用:

    if (!Array.prototype.every)
    {
      Array.prototype.every = function(fun /*, thisp*/)
      {
        var len = this.length;
        if (typeof fun != "function")
          throw new TypeError();
    
        var thisp = arguments[1];
        for (var i = 0; i < len; i++)
        {
          if (i in this &&
              !fun.call(thisp, this[i], i, this))
            return false;
        }
    
        return true;
      };
    }
    

    更多详细信息 请点击此处 .

  • 现在 ES6 中非常简洁 - [1,2,3].every( el => el !== 1 )

  • @Pacerier,您可以在 ES6 规范中看到索引 k 从 0 开始并以 1 为增量的算法:http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.every

  • @Pacerier,是的,大多数流行的实现都能正常工作。如果您担心嵌入式实现,通常是 Opera 或 webkit。方法 every 按升序对数组中存在的每个元素调用一次回调函数,直到找到一个回调函数返回 false 的元素。另请查看步骤 7。让 k 为 0。和 8.e 将 k 增加 1。

  • 引用 MDN documentation of Array.prototype.forEach() :

    除了抛出异常之外,没有其他方法可以停止或中断循环。如果您需要这样的行为,则该 方法 f或Each() 错误 .forEach() 工具 ,请改用普通循环。如果您正在测试谓词的数组元素并需要布尔返回值,则可以改用 every() or some()

    对于您的代码(在问题中),如@bobince所建议的,请改用 Array.prototype.some() 。它非常适合您的用例。

    Array.prototype.some() 对数组中存在的每个元素执行一次回调函数,直到找到一个回调函数返回真值(转换为 时变为 true 的值 Boolean )。如果找到这样的元素, some() 则立即返回 true。否则, some() 返回 false。回调仅对已分配值的数组索引调用;对于已删除或从未分配值的索引,不会调用它。

  • 引用 18

    这是正确答案。'some' 的作用与 foreach/break 完全相同。它会循环直到迭代 n = true。

  • Sonar 标记了它,没有使用 array.some() 返回的值。逻辑是仅将其用于循环。

  • 在某些方面,这甚至比中断更好,因为通常情况下,如果不使用额外的标志,很难确定循环是否“中断”。

返回
作者最近主题: