web-dev-qa-db-fra.com

Comment arrêter un JavaScript pour la boucle?

J'utilise ce JavaScript pour parcourir un tableau et trouver un élément de tableau correspondant:

var remSize = [], 
    szString, remData, remIndex, i;

for (i = 0; i < remSize.length; i++) {      
    // I'm looking for the index i, when the condition is true
    remSize[i].size == remData.size ? remIndex = i : remIndex = -1;     
}

Le tableau contient ces "tailles": ["34", "36", "38"...].

remData.size est la "taille" que je recherche (par exemple, "36").

Je dois renvoyer l'index i si la taille que je recherche se trouve dans l'index. Sinon, je dois retourner -1. Y a-t-il une meilleure manière de faire cela?

103
frequent

Pour arrêter une boucle for au début de JavaScript, utilisez break :

_var remSize = [], 
    szString,
    remData,
    remIndex,
    i;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // Set a default if we don't find it
for (i = 0; i < remSize.length; i++) {      
     // I'm looking for the index i, when the condition is true
     if (remSize[i].size === remData.size) {
          remIndex = i;
          break;       // <=== breaks out of the loop early
     }
}
_

Si vous vous trouvez dans un environnement ES2015 (ou ES6), pour ce cas d'utilisation spécifique , vous pouvez utiliser _Array#findIndex_ (pour rechercher l'entrée correspondante). index) ou _Array#find_ (pour trouver l'entrée elle-même), les deux pouvant être calés/remplis:

_var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = remSize.findIndex(function(entry) {
     return entry.size === remData.size;
});
_

_Array#find_:

_var remSize = [], 
    szString,
    remData,
    remEntry;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remEntry = remSize.find(function(entry) {
     return entry.size === remData.size;
});
_

_Array#findIndex_ arrête la première fois que le rappel renvoie une valeur de vérité, renvoyant l'index de cet appel au rappel; il renvoie _-1_ si le rappel ne renvoie jamais une valeur de vérité. _Array#find_ s'arrête également lorsqu'il trouve ce que vous recherchez, mais renvoie l'entrée, pas son index (ou undefined si le rappel ne renvoie jamais une valeur de vérité).

Si vous utilisez un environnement compatible ES5 (ou un shim ES5), vous pouvez utiliser la nouvelle fonction some sur les tableaux, qui appelle un rappel jusqu'à ce que le rappel renvoie une valeur de vérité:

_var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
remSize.some(function(entry, index) {
    if (entry.size === remData.size) {
        remIndex = index;
        return true; // <== Equivalent of break for `Array#some`
    }
});
_

Si vous utilisez jQuery, vous pouvez utiliser jQuery.each pour parcourir un tableau; cela ressemblerait à ceci:

_var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
jQuery.each(remSize, function(index, entry) {
    if (entry.size === remData.size) {
        remIndex = index;
        return false; // <== Equivalent of break for jQuery.each
    }
});
_
157
T.J. Crowder

La logique est incorrecte. Il renverrait toujours le résultat du dernier élément du tableau.

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}
10
amit_g

Utilisez à la place la boucle for qui fait partie de la version ES2015. Contrairement à forEach, nous pouvons utiliser return, break et continue. Voir https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/

let arr = [1,2,3,4,5];
for (let ele of arr) {
  if (ele > 3) break;
  console.log(ele);
}
8
Srini Karthikeyan