我正在使用Node.js和Mongoose -试图在深层注释嵌套中找到特定的注释,其中带有递归函数和forEach。有没有办法停止Node.js forEach?正如我所理解的,forEach迭代都是一个函数,我不能只做break,只做return,但这不会停止forEach。

function recurs(comment) {
    comment.comments.forEach(function(elem) {

        recurs(elem);

        //if(...) break;

    });
}

当前回答

    var f = "how to stop Javascript forEach?".split(' ');
    f.forEach(function (a,b){
        console.info(b+1);
        if (a == 'stop') {
            console.warn("\tposition: \'stop\'["+(b+1)+"] \r\n\tall length: " + (f.length)); 
            f.length = 0; //<--!!!
        }
    });

其他回答

如果你重写Array方法,你可以从forEach循环中中断:

(function(){
    window.broken = false;

        Array.prototype.forEach = function(cb, thisArg) {
            var newCb = new Function("with({_break: function(){window.broken = true;}}){("+cb.replace(/break/g, "_break()")+"(arguments[0], arguments[1], arguments[2]));}");
            this.some(function(item, index, array){
                 newCb(item, index, array);
                 return window.broken;
            }, thisArg);
            window.broken = false;
        }

}())

例子:

[1,2,3].forEach("function(x){\
    if (x == 2) break;\
    console.log(x)\
}")

不幸的是,在这个解决方案中,你不能在回调中使用普通的break,你必须将无效代码包装在字符串中,本机函数不能直接工作(但你可以解决这个问题)

破坏快乐!

jQuery提供了一个each()方法,而不是forEach()方法。你可以通过返回false来突破每一个。forEach()是ECMA-262标准的一部分,据我所知,打破该标准的唯一方法是抛出异常。

function recurs(comment) {
  try {
    comment.comments.forEach(function(elem) {
      recurs(elem);
      if (...) throw "done";
    });
  } catch (e) { if (e != "done") throw e; }
}

很丑,但很管用。

forEach不会在返回时中断,有一些丑陋的解决方案来完成这项工作,但我建议不要使用它,而是尝试使用Array.prototype.some或Array.prototype.every

Var ar = [1,2,3,4,5]; ar.some(函数(项目、索引){ If (item == 3){ 返回true; } Console.log ("item is:"+item+" index is:"+ index); });

如果你不介意使用第三方库,你可以使用Lodash的forEach函数。

例子:

var _ = require('lodash');

_.forEach(comments, function (comment) {
    do_something_with(comment);

    if (...) {
        return false;     // Exits the loop.
    }
})

我猜你想用array。prototype。find Find在数组中找到特定值时将自行中断。

var inventory = [
  {name: 'apples', quantity: 2},
  {name: 'bananas', quantity: 0},
  {name: 'cherries', quantity: 5}
];

function findCherries(fruit) { 
  return fruit.name === 'cherries';
}

console.log(inventory.find(findCherries)); 
// { name: 'cherries', quantity: 5 }