Ei voida lukea määrittelemättömän ominaisuuden 'jakoa'

Jos olet koskaan käytetty JavaScriptin splitmenetelmä, siellä on hyvä mahdollisuus, että olet kohdannut seuraavan virheen: TypeError: Cannot read property 'split' of undefined.

Voit saada tämän virheen muutamasta syystä. Todennäköisesti se on vain perus väärinkäsitys siitä, miten se splittoimii ja kuinka iteroida taulukoiden kautta.

Esimerkiksi, jos yrität lähettää seuraavan koodin Etsi pisin sana merkkijonohaasteessa:

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

se heittää TypeError: Cannot read property 'split' of undefinedvirheen.

splitmenetelmä

Kun splitsitä kutsutaan merkkijonoon, se jakaa merkkijonon alimerkkijonoksi argumenttina syötetyn erottimen perusteella. Jos tyhjä merkkijono välitetään argumenttina, splitkäsitellään kutakin merkkiä alimerkkinä. Sitten se palauttaa matriisin, joka sisältää alijonot:

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

Katso lisätietoja MDN: stä split.

Ongelma selitettiin esimerkeillä

Tieto siitä, mitä splitmenetelmä palauttaa ja kuinka monta alaosaa voit odottaa, on avain tämän haasteen ratkaisemiseen.

Katsotaanpa uudelleen yllä olevaa koodia ja katsotaan, miksi se ei toimi odotetulla tavalla:

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

Halkaisu strtällaiseksi taulukoksi ( const array = str.split(" ");) toimii odotetulla tavalla ja palaa [ 'The',   'quick',   'brown',   'fox',   'jumped',   'over',   'the',   'lazy',   'dog' ].

Mutta katsokaa forsilmukkaa tarkemmin . Sen sijaan, että käytetään pituuden arrayehtona iterointia i, str.lengthkäytetään sen sijaan.

stron "Nopea ruskea kettu hyppäsi laiskan koiran yli", ja jos kirjaudut str.lengthkonsoliin, saat 44.

Viimeinen toteamus runkoon forsilmukka on mitä aiheuttaa virheen: array[i].split("");. Pituus arrayon 9, joten se imenisi nopeasti yli seuraavien enimmäispituuksien 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"); 

Kutsu array[i].split("");kutakin merkkijonoa jakamaan merkkien alaosiksi on kelvollinen tapa, mutta se heittää, TypeError: Cannot read property 'split' of undefinedkun se on ohitettu undefined.

Kuinka ratkaista Etsi merkkijonon pisin sana split

Käydään nopeasti läpi pseudokoodi ongelman ratkaisemiseksi:

  1. Jaettu strjoukoksi yksittäisiä sanoja
  2. Luo muuttuja suurimman sanan pituuden seuraamiseksi
  3. Toista sanaryhmän läpi ja vertaa kunkin sanan pituutta yllä mainittuun muuttujaan
  4. Jos nykyisen sanan pituus on suurempi kuin muuttujaan tallennettu, korvaa arvo nykyisellä sanan pituudella
  5. Kun jokaisen sanan pituutta on verrattu sanan enimmäispituuden muuttujaan, palauta luku funktiosta

Jaa strensin joukoksi yksittäisiä sanoja:

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

Luo muuttuja pitämään kirjaa pisin sanan pituudesta ja aseta se nollaan:

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

Nyt kun arvo arrayon ['The', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog'], voit käyttää array.lengthoman forsilmukka:

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

Toista sanaryhmän läpi ja tarkista jokaisen sanan pituus. Muista, että merkkijonoilla on myös lengthmenetelmä, johon voit soittaa, jotta saat helposti merkkijonon pituuden:

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

Käytä iflauseketarkistusta, jos nykyisen sanan ( array[i].length) pituus on suurempi kuin maxLength. Jos on, aseta arvo maxLengthkanssa array[i].length:

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

Palaa maxLengthlopuksi funktion lopussa forsilmukan jälkeen:

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