Impossible de lire la propriété 'split' de Undefined

Si vous avez déjà utilisé JavaScript de splitméthode, il y a une bonne chance que vous avez rencontré l'erreur suivante: TypeError: Cannot read property 'split' of undefined.

Il y a plusieurs raisons pour lesquelles vous recevriez cette erreur. Très probablement, il s'agit simplement d'un malentendu de base sur la façon dont splitfonctionne et comment parcourir les tableaux.

Par exemple, si vous essayez de soumettre le code suivant pour le défi Rechercher le mot le plus long dans une chaîne:

function findLongestWord(str) { for(let i = 0; i < str.length; i++) { const array = str.split(" "); array[i].split(""); } } findLongestWord("The quick brown fox jumped over the lazy dog");

cela jettera l' TypeError: Cannot read property 'split' of undefinederreur.

La splitméthode

Lorsqu'il splitest appelé sur une chaîne, il divise la chaîne en sous-chaînes en fonction du séparateur passé en argument. Si une chaîne vide est passée comme argument, splittraite chaque caractère comme une sous-chaîne. Il retourne ensuite un tableau contenant les sous-chaînes:

const testStr1 = "Test test 1 2"; const testStr2 = "cupcake pancake"; const testStr3 = "First,Second,Third"; testStr1.split(" "); // [ 'Test', 'test', '1', '2' ] testStr2.split(""); // [ 'c', 'u', 'p', 'c', 'a', 'k', 'e', ' ', 'p', 'a', 'n', 'c', 'a', 'k', 'e' ] testStr3.split(","); // [ 'First', 'Second', 'Third' ] 

Consultez MDN pour plus de détails sur split.

Le problème expliqué avec des exemples

Savoir ce que la splitméthode renvoie et combien de sous-chaînes vous pouvez vous attendre est la clé pour résoudre ce défi.

Jetons un autre regard sur le code ci-dessus et voyons pourquoi il ne fonctionne pas comme prévu:

function findLongestWord(str) { for(let i = 0; i < str.length; i++) { const array = str.split(" "); array[i].split(""); } } findLongestWord("The quick brown fox jumped over the lazy dog"); 

Le fractionnement stren un tableau comme celui-ci ( const array = str.split(" ");) fonctionne comme prévu et retourne [ 'The',   'quick',   'brown',   'fox',   'jumped',   'over',   'the',   'lazy',   'dog' ].

Mais regardez de plus près la forboucle. Plutôt que d'utiliser la longueur de arraycomme condition pour itérer i, str.lengthest utilisé à la place.

strest "Le renard brun rapide a sauté par-dessus le chien paresseux", et si vous vous connectez str.lengthà la console, vous obtiendrez 44.

La dernière déclaration dans le corps de la forboucle est ce qui cause l'erreur: array[i].split("");. La longueur de arrayest de 9, donc iirait rapidement bien au-delà de la longueur maximale de array:

function findLongestWord(str) { for(let i = 0; i < str.length; i++) { const array = str.split(" "); console.log(array[i]); // array[0]: "The" // array[1]: "quick" // array[2]: "brown" // ... // array[9]: "dog" // array[10]: undefined // array[11]: undefined } } findLongestWord("The quick brown fox jumped over the lazy dog"); 

L'appel array[i].split("");à diviser chaque chaîne en sous-chaînes de caractères est une approche valide, mais elle sera lancée TypeError: Cannot read property 'split' of undefinedlorsqu'elle est passée undefined.

Comment résoudre Trouver le mot le plus long dans une chaîne avec split

Passons rapidement en revue un pseudo code pour savoir comment résoudre ce problème:

  1. Divisé stren un tableau de mots individuels
  2. Créez une variable pour suivre la plus grande longueur de mot
  3. Parcourez le tableau de mots et comparez la longueur de chaque mot à la variable mentionnée ci-dessus
  4. Si la longueur du mot actuel est supérieure à celle stockée dans la variable, remplacez cette valeur par la longueur du mot actuel
  5. Une fois que la longueur de chaque mot est comparée à la variable de longueur de mot maximale, renvoyez ce nombre à partir de la fonction

Tout d'abord, divisez-vous stren un tableau de mots individuels:

function findLongestWordLength(str) { const array = str.split(" "); }

Créez une variable pour garder une trace de la longueur de mot la plus longue et définissez-la sur zéro:

function findLongestWordLength(str) { const array = str.split(" "); let maxWordLength = 0; }

Maintenant que la valeur de arrayest ['The', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog'], vous pouvez utiliser array.lengthdans votre forboucle:

function findLongestWordLength(str) { const array = str.split(" "); let maxWordLength = 0; for (let i = 0; i < array.length; i++) { } }

Parcourez le tableau de mots et vérifiez la longueur de chaque mot. N'oubliez pas que les chaînes ont également une lengthméthode que vous pouvez appeler pour obtenir facilement la longueur d'une chaîne:

function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i < array.length; i++) { array[i].length; } }

Utilisez une ifinstruction pour vérifier si la longueur du mot actuel ( array[i].length) est supérieure à maxLength. Si tel est le cas, remplacez la valeur de maxLengthpar array[i].length:

function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i  maxLength) { maxLength = array[i].length; } } }

Enfin, retournez maxLengthà la fin de la fonction, après la forboucle:

function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i  maxLength) { maxLength = array[i].length; } } return maxLength; }