No se puede leer la propiedad 'dividida' de indefinida

Si alguna vez has usado de JavaScript splitmétodo, hay una buena probabilidad de que usted ha encontrado el siguiente error: TypeError: Cannot read property 'split' of undefined.

Hay algunas razones por las que recibiría este error. Lo más probable es que sea solo un malentendido básico de cómo splitfunciona y cómo iterar a través de matrices.

Por ejemplo, si intenta enviar el siguiente código para el desafío Buscar la palabra más larga en una cadena:

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");

arrojará el TypeError: Cannot read property 'split' of undefinederror.

El splitmétodo

Cuando splitse llama en una cadena, divide la cadena en subcadenas según el separador que se pasa como argumento. Si se pasa una cadena vacía como argumento, splittrata cada carácter como una subcadena. Luego devuelve una matriz que contiene las subcadenas:

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' ] 

Consulte MDN para obtener más detalles sobre split.

El problema explicado con ejemplos.

Saber qué splitdevuelve el método y cuántas subcadenas puede esperar es la clave para resolver este desafío.

Echemos otro vistazo al código anterior y veamos por qué no funciona como se esperaba:

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"); 

Dividir stren una matriz como esta ( const array = str.split(" ");) funciona como se esperaba y regresa [ 'The',   'quick',   'brown',   'fox',   'jumped',   'over',   'the',   'lazy',   'dog' ].

Pero mire más de cerca el forbucle. En lugar de usar la longitud de arraycomo condición para iterar i, str.lengthse usa en su lugar.

stres "El rápido zorro marrón saltó sobre el perro perezoso", y si inicias sesión str.lengthen la consola, obtendrás 44.

La última instrucción en el cuerpo del forbucle es lo que está causando el error: array[i].split("");. La longitud de arrayes 9, por ilo que rápidamente superaría la longitud máxima 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"); 

Llamar array[i].split("");para dividir cada cadena en subcadenas de caracteres es un enfoque válido, pero arrojará TypeError: Cannot read property 'split' of undefinedcuando se pase undefined.

Cómo resolver Buscar la palabra más larga en una cadena con split

Repasemos rápidamente algunos pseudocódigos sobre cómo resolver este problema:

  1. Dividir stren una variedad de palabras individuales
  2. Cree una variable para rastrear la mayor longitud de palabra
  3. Repita la matriz de palabras y compare la longitud de cada palabra con la variable mencionada anteriormente.
  4. Si la longitud de la palabra actual es mayor que la almacenada en la variable, reemplace ese valor con la longitud de la palabra actual
  5. Una vez que se compara la longitud de cada palabra con la variable de longitud máxima de palabra, devuelve ese número de la función

Primero, divídalo stren una variedad de palabras individuales:

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

Cree una variable para realizar un seguimiento de la longitud de palabra más larga y ajústela a cero:

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

Ahora que el valor de arrayes ['The', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog'], puede usar array.lengthen su forciclo:

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

Repita el conjunto de palabras y verifique la longitud de cada palabra. Recuerde que las cadenas también tienen un lengthmétodo al que puede llamar para obtener fácilmente la longitud de una cadena:

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

Utilice una ifcomprobación de declaración si la longitud de la palabra actual ( array[i].length) es mayor que maxLength. Si es así, reemplace el valor de maxLengthcon array[i].length:

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

Finalmente, regrese maxLengthal final de la función, después del forciclo:

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