Ei voida lukea määrittelemättömän ominaisuuden 'jakoa'
Jos olet koskaan käytetty JavaScriptin split
menetelmä, 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 split
toimii 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 undefined
virheen.
split
menetelmä
Kun split
sitä kutsutaan merkkijonoon, se jakaa merkkijonon alimerkkijonoksi argumenttina syötetyn erottimen perusteella. Jos tyhjä merkkijono välitetään argumenttina, split
kä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ä split
menetelmä 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 str
tällaiseksi taulukoksi ( const array = str.split(" ");
) toimii odotetulla tavalla ja palaa [ 'The', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog' ]
.
Mutta katsokaa for
silmukkaa tarkemmin . Sen sijaan, että käytetään pituuden array
ehtona iterointia i
, str.length
käytetään sen sijaan.
str
on "Nopea ruskea kettu hyppäsi laiskan koiran yli", ja jos kirjaudut str.length
konsoliin, saat 44.
Viimeinen toteamus runkoon for
silmukka on mitä aiheuttaa virheen: array[i].split("");
. Pituus array
on 9, joten se i
menisi 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 undefined
kun se on ohitettu undefined
.
Kuinka ratkaista Etsi merkkijonon pisin sana split
Käydään nopeasti läpi pseudokoodi ongelman ratkaisemiseksi:
- Jaettu
str
joukoksi yksittäisiä sanoja - Luo muuttuja suurimman sanan pituuden seuraamiseksi
- Toista sanaryhmän läpi ja vertaa kunkin sanan pituutta yllä mainittuun muuttujaan
- Jos nykyisen sanan pituus on suurempi kuin muuttujaan tallennettu, korvaa arvo nykyisellä sanan pituudella
- Kun jokaisen sanan pituutta on verrattu sanan enimmäispituuden muuttujaan, palauta luku funktiosta
Jaa str
ensin 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 array
on ['The', 'quick', 'brown', 'fox', 'jumped', 'over', 'the', 'lazy', 'dog']
, voit käyttää array.length
oman for
silmukka:
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 length
menetelmä, 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ä if
lauseketarkistusta, jos nykyisen sanan ( array[i].length
) pituus on suurempi kuin maxLength
. Jos on, aseta arvo maxLength
kanssa array[i].length
:
function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i maxLength) { maxLength = array[i].length; } } }
Palaa maxLength
lopuksi funktion lopussa for
silmukan jälkeen:
function findLongestWordLength(str) { const array = str.split(" "); let maxLength = 0; for (let i = 0; i maxLength) { maxLength = array[i].length; } } return maxLength; }