Dacă ați folosit vreodată JavaScript split metodă, există șanse mari să întâlniți următoarea eroare: TypeError: Cannot read property 'split' of undefined.

Există câteva motive pentru care ați primi această eroare. Cel mai probabil este doar o neînțelegere de bază despre cum split funcționează și cum să iterați prin tablouri.

De exemplu, dacă încercați să trimiteți următorul cod pentru provocarea Găsiți cel mai lung cuvânt într-un șir:

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

va arunca TypeError: Cannot read property 'split' of undefined eroare.

split metodă

Cand split este apelat pe un șir, împarte șirul în șiruri de caractere pe baza separatorului trecut ca argument. Dacă un șir gol este trecut ca argument, split tratează fiecare personaj ca pe un șir de caractere. Apoi returnează o matrice care conține șirurile:

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

Verifică MDN pentru mai multe detalii despre split.

Problema explicată cu exemple

Știind ce split metoda se întoarce și câte substraturi vă puteți aștepta este cheia pentru rezolvarea acestei provocări.

Să aruncăm o altă privire asupra codului de mai sus și să vedem de ce nu funcționează conform așteptărilor:

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

Despicare str într-o matrice ca aceasta (const array = str.split(" ");) funcționează conform așteptărilor și revine [ 'The',   'quick',   'brown',   'fox',   'jumped',   'over',   'the',   'lazy',   'dog' ].

Dar aruncați o privire mai atentă la for buclă. Mai degrabă decât să folosiți lungimea array ca o condiție de iterat i, str.length este folosit în schimb.

str este „Vulpea brună și rapidă a sărit peste câinele leneș” și dacă te loghezi str.length la consolă, vei primi 44.

Ultima afirmație din corpul for bucla este ceea ce cauzează eroarea: array[i].split("");. Lungimea array este 9, deci i ar trece rapid peste lungimea maximă 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");

Apelare array[i].split(""); împărțirea fiecărui șir în șiruri de caractere este o abordare validă, dar va arunca TypeError: Cannot read property 'split' of undefined când a trecut undefined.

Cum se rezolvă Găsiți cel mai lung cuvânt dintr-un șir cu split

Să trecem repede peste un pseudo-cod pentru a rezolva această problemă:

  1. Despică str într-o serie de cuvinte individuale
  2. Creați o variabilă pentru a urmări cea mai mare lungime a cuvântului
  3. Ierați prin gama de cuvinte și comparați lungimea fiecărui cuvânt cu variabila menționată mai sus
  4. Dacă lungimea cuvântului curent este mai mare decât cea stocată în variabilă, înlocuiți acea valoare cu lungimea cuvântului curent
  5. Odată ce lungimea fiecărui cuvânt este comparată cu variabila lungime maximă a cuvântului, returnați acel număr din funcție

Mai întâi, împărțiți-vă str într-o serie de cuvinte individuale:

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

Creați o variabilă pentru a urmări cea mai lungă lungime a cuvântului și setați-l la zero:

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

Acum că valoarea array este ['The', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog'], poți să folosești array.length în dumneavoastră for buclă:

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

Iterează prin matricea de cuvinte și verifică lungimea fiecărui cuvânt. Amintiți-vă că șirurile au și un length metoda pe care o puteți apela pentru a obține cu ușurință lungimea unui șir:

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

Folosiți un if declarație verificați dacă lungimea cuvântului curent (array[i].length) este mai mare decât maxLength. Dacă da, înlocuiți valoarea maxLength cu array[i].length:

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

În cele din urmă, întoarce-te maxLength la sfârșitul funcției, după for buclă:

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