2016-10-07 5 views
0

Lorsque j'exécute la fonction ci-dessous, j'obtiens cette erreur:Confusion "Boucle infinie potentielle"

"Erreur: Boucle infinie potentielle."

Le problème semble être le "0" que j'utilise dans la méthode d'épissure, parce que quand je le change à n'importe quel autre nombre (1 - 9) je n'obtiens pas cette erreur.

Je ne suis pas sûr de savoir comment cela créerait une boucle infinie.

Le "0" que j'utilise dans la méthode d'épissage est-il confondu avec "i" ou quelque chose?

L'aide est grandement appréciée, merci.

function spinalCase(str) { 
    var array = str.split(""); 
    for (i = 0; i < array.length; i++) { 
    if (array[i] !== array[i].toLowerCase()) { 
     array.splice(i, 0, " "); 
    } 
    } 
    return array; 
} 
spinalCase('AllThe-small Things'); 
+0

Lire sur la syntaxe de [__'Array # splice'__] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) – Rayon

+0

Quel est le but de 'array.splice (i, 0," ");' voulez-vous remplacer l'élément actuel par de l'espace? – gurvinder372

+1

Votre code insère de nouveaux éléments dans le tableau, ce qui agrandit 'array.length'. – nnnnnn

Répondre

2

array.splice(i, 0, " "); dit d'insérer un nouvel élément à l'indice i actuel. Ce qui signifie que l'objet qui se trouvait à i a été poussé à i + 1. Ainsi, à la prochaine itération de la boucle, vous traitez à nouveau le même élément, ce qui entraîne une autre insertion, etc., pour toujours.

Vous pouvez augmenter i un temps supplémentaire à l'intérieur du bloc if, mais je préfère boucle arrière:

function spinalCase(str) { 
 
    var array = str.split(""); 
 
    for (i = array.length - 1; i >= 0; i--) { 
 
    if (array[i] !== array[i].toLowerCase()) { 
 
     array.splice(i, 0, " "); 
 
    } 
 
    } 
 
    return array; 
 
} 
 
console.log(spinalCase('AllThe-small Things'));

+0

Aha! Merci. La principale chose que j'ai ratée était le fait que l'élément courant à l'index "i" est augmenté d'un, en utilisant mon ancienne syntaxe for-loop. Merci encore! – Edson