2010 votes

Comment court-circuit de Tableau.forEach comme appeler la pause?

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

Comment puis-je faire cela à l'aide de la nouvelle - forEach méthode en JavaScript?

2665voto

bobince Points 270740

Il n'y a pas de possibilité de break en forEach. Pour interrompre l'exécution, vous auriez à jeter une exception de quelque sorte. par exemple.

var BreakException= {};

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

Exceptions JavaScript ne sont pas très jolies. Une traditionnelle for boucle peut être plus approprié si vous avez vraiment besoin d' break à l'intérieur.

Au lieu de cela, utiliser des Array#some:

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

Cela fonctionne parce qu' some retours true dès les rappels, exécuté dans le tableau de commande, retour true, de court-circuiter l'exécution du reste.

some, son inverse every (qui va s'arrêter sur un return false), et forEach sont tous ECMAScript Cinquième Édition de méthodes qui doivent être ajoutés à l' Array.prototype sur les navigateurs où ils manquent.

231voto

Vous pouvez utiliser chaque méthode:

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

pour les vieux navigateur prend en charge l'utilisation:

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;
  };
}

plus de détails ici.

201voto

x0n Points 26002

Peut-être que je suis absent quelque chose ici, mais on dirait que vous pourriez être victime d'une des brillants-new-jouet maladie. Pourquoi ne pas simplement utiliser une norme for/break? forEach est conçu pour être exécuté sur chaque élément, d'où le nom. Il ne s'appelle pas forSome ;-)

29voto

vittore Points 8364

Vous pouvez également utiliser jQuery.each(function(element, index) {}); dès que vous pouvez utiliser return false; à l'intérieur de

21voto

Chris West Points 333

Si vous souhaitez utiliser Dean Edward de la suggestion et de jeter le StopIteration erreur de sortir de la boucle sans avoir à prendre l'erreur, vous pouvez utiliser les paramètres suivants de la fonction (à l'origine à partir d'ici):

// Use a closure to prevent the global namespace from be polluted.
(function() {
  // Define StopIteration as part of the global scope if it
  // isn't already defined.
  if(typeof StopIteration == "undefined") {
    StopIteration = new Error("StopIteration");
  }

  // The original version of Array.prototype.forEach.
  var oldForEach = Array.prototype.forEach;

  // If forEach actually exists, define forEach so you can
  // break out of it by throwing StopIteration.  Allow
  // other errors will be thrown as normal.
  if(oldForEach) {
    Array.prototype.forEach = function() {
      try {
        oldForEach.apply(this, [].slice.call(arguments, 0));
      }
      catch(e) {
        if(e !== StopIteration) {
          throw e;
        }
      }
    };
  }
})();

Le code ci-dessus vous donne la possibilité d'exécuter du code comme le suivant, sans avoir à faire votre propre try-catch clauses:

// Show the contents until you get to "2".
[0,1,2,3,4].forEach(function(val) {
  if(val == 2)
    throw StopIteration;
  alert(val);
});

Une chose importante à retenir est que cela ne fera que mettre à jour le Tableau.le prototype.forEach fonction si elle existe déjà. Si elle n'existe pas déjà, il ne modifiera pas la.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X