3. Objecten
3. Objecten
Tijdens deze les oefen je op:
- Het aanmaken, manipuleren en doorlopen van objecten en geneste objecten
- Het gebruik van prototype inheritance
Oefening 1a
Schrijf 3 objecten die een boek voorstellen en print deze met console.log(). De properties en waarden ervan zijn als volgt:
Boek 1
- title: 'The Hobbit'
- author: 'J.R.R. Tolkien'
- published: 1937
Boek 2
- title: '1984'
- author: 'George Orwell'
- published: 1949
- wordCount: 88900
Boek 3
- title: 'Pride and Prejudice'
- author: 'Jane Austen'
- published: 1813
- wordCount: 124713
Toon ook de som van de wordCount van de laatste 2 boeken. Gebruik hiervoor de properties van de objecten.
{
title: "The Hobbit",
author: "J.R.R. Tolkien",
published: 1937,
}
{
title: "1984",
author: "George Orwell",
published: 1949,
wordCount: 88900,
}
{
title: "Pride and Prejudice",
author: "Jane Austen",
published: 1813,
wordCount: 124713,
}
Totaal woorden 1984 en P&P: 213613Oefening 1b
Breid de boeken uit met een methode getInfo die de informatie teruggeeft als
titel by <author>, published in <publicationYear> (<wordCount> words)
of (als het aantal woorden onbekend is)
titel by <author>, published in <publicationYear>
Boek 1
- title: 'The Hobbit'
- author: 'J.R.R. Tolkien'
- published: 1937
Boek 2
- title: '1984'
- author: 'George Orwell'
- published: 1949
- wordCount: 88900
Boek 3
- title: 'Pride and Prejudice'
- author: 'Jane Austen'
- published: 1813
- wordCount: 124713
Roep de getInfo methode op voor elk boek.
The Hobbit by J.R.R. Tolkien, published in 1937
1984 by George Orwell, published in 1949 (88900 words)
Pride and Prejudice by Jane Austen, published in 1813 (124713 words)Pas daarna de wordCount property van 'The Hobbit' aan naar 95356 en roep de getInfo methode opnieuw op om je wijziging te controleren. Je mag het object niet opnieuw aanmaken om de wordCount toe te voegen.
The Hobbit by J.R.R. Tolkien, published in 1937 (95356 words)Oefening 2
De code uit bovenstaande oefening is redelijk repetitief. Schrijf een functie createBook die vier parameters (title, author, published en wordCount) heeft en gebruikt kan worden om een boek object aan te maken. Voeg daarnaast nog een extra methode toe die het type boek bepaalt en teruggeeft. Als een boek minder dan 7500 woorden bevat is het een 'Short Story', als er minder dan 20000 woorden zijn is het een 'Novelette', als het minder dan 40000 woorden zijn is het een 'Novella', als het minder dan 250000 woorden zijn is het een 'Novel' en anders is het een 'Doorstopper'. In het geval dat het aantal woorden niet bekend is, geeft de methode 'Unknown' terug.
Je kan onderstaande array gebruiken om je functie te testen.
const books = [
createBook('The Hobbit', 'J.R.R. Tolkien', 1937),
createBook('1984', 'George Orwell', 1949, 88900),
createBook('Pride and Prejudice', 'Jane Austen', 1813, 124713),
createBook('War and Peace', 'Leo Tolstoy', 1867, 544406),
createBook('The Tell-Tale Heart', 'Edgar Allan Poe', 1843, 2093),
createBook('The Metamorphosis', 'Franz Kafka', 1915, 22185),
createBook('Strange Case of Dr Jekyll and Mr Hyde', 'Robert Louis Stevenson', 1886, 13500),
];Gebruik de books array om de informatie over elk boek uit te printen.
The Hobbit is a Unknown
1984 is a Novel
Pride and Prejudice is a Novel
War and Peace is a Doorstopper
The Tell-Tale Heart is a Short Story
The Metamorphosis is a Novella
Strange Case of Dr Jekyll and Mr Hyde is a NoveletteOefening 3
Maak de array uit oefening 2 opnieuw aan. Je mag de data aanpassen of uitbreiden als je dat wil.
Maak een functie die als parameters een array binnen krijgt en een maxYear. De functie geeft een array terug. Gebruik de array.filter functie om alle boeken terug te geven die voor of in het maxYear gepubliceerd zijn.
Roep de functie op en gebruik de array.forEach methode op de output om voor elk boek de getInfo methode op te roepen.
Met de data uit oefening 2, en het jaartal 1900 als max, krijg je onderstaand resultaat:
Pride and Prejudice by Jane Austen, published in 1813 (124713 words)
War and Peace by Leo Tolstoy, published in 1867 (544406 words)
The Tell-Tale Heart by Edgar Allan Poe, published in 1843 (2093 words)
Strange Case of Dr Jekyll and Mr Hyde by Robert Louis Stevenson, published in 1886 (13500 words)Oefening 4
Schrijf een functie mergeObjects die twee willekeurige objecten als argumenten neemt en een nieuw object teruggeeft dat de keys en bijhorende waardes van beide objecten bevat (een samengevoegd object).
Als een key in beide objecten voorkomt: toon je dat aan de gebruiker, toon je de huidige waardes, en vraag je aan de gebruiker van welk object de waarde behouden moet worden. Je doet dat met een prompt die als default 1 heeft.
Roep de functie op met onderstaande objecten en print het resultaat.
const object1 = {
a: 1,
b: 2,
c: 3,
};
const object2 = {
b: 4,
c: 5,
d: 6,
};De functie moet als volgt werken:
Key b exists for both objects.
Current values:
1: 2
2: 4
Wich object shall I use to set the value of the result [1/2]? [1] 2
Key c exists for both objects.
Current values:
1: 3
2: 5
Wich object shall I use to set the value of the result [1/2]? [1] 1
{
a: 1,
d: 6,
b: 4,
c: 3,
}Oefening 5
Voeg een nieuwe functie sortNumerical toe aan het prototype van een Array. Deze methode moet een array sorteren op basis van de numerieke waardes van de elementen.
Array 4,5,3,9,111,6,0,2,1 sorted with Array.prototype.sortNumerical: 0,1,2,3,4,5,6,9,111Voeg nog een extra methode sortObject toe aan het prototype van een Array waar een array van objecten gesorteerd kan worden. Deze methode heeft twee parameters, key en type. De key parameter bepaald de naam van de property waarop gesorteerd moet worden, de type parameter bepaald of er gesorteerd moet worden op numerieke of alfabetische waardes.
Gebruik de array en createBook functie uit oefening 2 om de methode te testen.
Books sorted by title:
1984 by George Orwell, published in 1949 (88900 words)
Pride and Prejudice by Jane Austen, published in 1813 (124713 words)
Strange Case of Dr Jekyll and Mr Hyde by Robert Louis Stevenson, published in 1886 (13500 words)
The Hobbit by J.R.R. Tolkien, published in 1937
The Metamorphosis by Franz Kafka, published in 1915 (22185 words)
The Tell-Tale Heart by Edgar Allan Poe, published in 1843 (2093 words)
War and Peace by Leo Tolstoy, published in 1867 (544406 words)
Books sorted by word count:
Strange Case of Dr Jekyll and Mr Hyde by Robert Louis Stevenson, published in 1886 (13500 words)
1984 by George Orwell, published in 1949 (88900 words)
Pride and Prejudice by Jane Austen, published in 1813 (124713 words)
The Hobbit by J.R.R. Tolkien, published in 1937
The Tell-Tale Heart by Edgar Allan Poe, published in 1843 (2093 words)
The Metamorphosis by Franz Kafka, published in 1915 (22185 words)
War and Peace by Leo Tolstoy, published in 1867 (544406 words)Oefening 6
Vraag de gebruiker om hun geboortedatum (in YYYY-MM-DD formaat) in te geven. Gebruik deze datum om de volgende informatie weer te geven:
- De geboortedatum in DD/MM/YYYY formaat
- De huidige in het 'Vandaag is het donderdag 28 nov. 2024' formaat
- De leeftijd van de gebruiker in dagen
Geef je geboortedatum in (YYYY-MM-DD): 1994-01-30
Je geboortedatum is: 30/01/1994
Vandaag is het donderdag 28 nov 2024
Je bent 11260 dagen oud.Oefening 7
Schrijf een functie getCharacterFrequency die een string als argument neemt en een object teruggeeft met het aantal keer dat elk karakter voorkomt in een string die als parameter doorgegeven wordt.
Geef een tekst in: Dit is een voorbeeld string met verschillende karakters
{
D: 1,
i: 4,
t: 4,
s: 4,
e: 9,
n: 3,
v: 2,
o: 2,
r: 5,
b: 1,
l: 3,
d: 2,
g: 1,
m: 1,
c: 1,
h: 1,
k: 2,
a: 2,
}Oefening 8
Schrijf een functie getValueByPath die twee argumenten krijgt:
- een array van strings/numbers
- een object
De array beschrijft het pad naar de specifieke property in het object die je wil printen (in de juiste volgorde, zie voorbeeld hieronder), en het object is de data (hier bestaat deze uit 2 properties: de array books en de array authors).
De properties van het object met de data kunnen zelf objecten zijn (en dus ook arrays met objecten) waardoor je meerdere niveaus kunt hebben. Om in onderstaand data object tot het 2de genre van de boek 'The Hobbit' te komen ('Adventure'), moeten we dus eerst naar de array books, daarna naar het eerste object in die array (index 0), daarna naar de property genres, en daarna naar het 2de object in die array (index 1). Je input array zal dus zijn ['books', 0, 'genres', 1].
De functie moet de array gebruiken om de corresponderende waarde uit het object uit te lezen.
Gebruik onderstaand object om de functie te testen.
const data = {
books: [
{
title: 'The Hobbit',
author: 'J.R.R. Tolkien',
published: 1937,
wordCount: 95356,
genres: ['Fantasy', 'Adventure'],
},
{
title: '1984',
author: 'George Orwell',
published: 1949,
wordCount: 88900,
genres: ['Dystopian', 'Political Fiction'],
},
{
title: 'Pride and Prejudice',
author: 'Jane Austen',
published: 1813,
wordCount: 124713,
genres: ['Romance', 'Regency Romance'],
},
{
title: 'War and Peace',
author: 'Leo Tolstoy',
published: 1867,
wordCount: 544406,
genres: ['Historical Fiction'],
},
{
title: 'The Tell-Tale Heart',
author: 'Edgar Allan Poe',
published: 1843,
wordCount: 2093,
genres: ['Gothic Fiction'],
},
{
title: 'The Metamorphosis',
author: 'Franz Kafka',
published: 1915,
wordCount: 22185,
genres: ['Absurdist Fiction'],
},
{
title: 'Strange Case of Dr Jekyll and Mr Hyde',
author: 'Robert Louis Stevenson',
published: 1886,
wordCount: 13500,
genres: ['Gothic Fiction', 'Mystery'],
}
],
authors: [
'J.R.R. Tolkien',
'George Orwell',
'Jane Austen',
'Leo Tolstoy',
'Edgar Allan Poe',
'Franz Kafka',
'Robert Louis Stevenson',
]
}In onderstaande uitvoer is de functie drie keer opgeroepen met volgende argumenten:
- ['books', 0, 'title']
- ['authors', 2]
- ['books', 1, 'genres', 0]
The Hobbit
Jane Austen
DystopianOptioneel & uitdagend Oefening 9
Schrijf een functie exploreObject die gebruikt kan worden om de inhoud van een object te ontdekken, gebruik het object uit bovenstaande oefening om de functie te testen.
De functie werkt anders afhankelijk van het type data dat gekoppeld is aan de key:
- Als de waarde een string, number of boolean is, print je de key en de waarde.
- Als de waarde een array is, print je de lengte van de array uit en kan de gebruiker een index kiezen om de waarde van die index te printen. Ga online op zoek naar een manier om te controleren of iets een array is.
- Als de waarde een object is, print je de keys van het object en kan de gebruiker een key kiezen om de waarde van die key te printen.
Verder zijn er enkele algemene opties die (bijna) altijd beschikbaar zijn:
- Als er een parent object is, kan de gebruiker terugkeren naar de parent door '..' in te geven.
- Als de gebruiker het programma wilt stoppen, moet de string 'exit' ingegeven worden.
Implementatie tips
Gebruikt de functie uit de vorige oefening.
Hou bovenaan in de exploreObject een array bij met het huidige pad. Bijvoorbeeld: ['books', 0, 'title'].
Gebruik een while loop om de gebruiker te blijven vragen om input.
- Gebruik de currentObject functie om op basis van de array uit stap 2 de waarde die bij het huidige pad hoort te vinden.
- Gebruik de typeof en Array.isArray functies om te bepalen of de gebruiker een nieuwe key moet kiezen of dat de waarde geprint moet worden.
- Voer de juiste acties uit zoals hierboven beschreven. Hoe verder rekening met onderstaande punten:
- Als er een key ingegeven wordt, moet deze toegevoegd worden aan de array uit stap 2.
- Als de gebruiker '..' ingeeft, moet de laatste key uit de array verwijderd worden.
- Als de gebruiker 'exit' ingeeft, moet de loop gestopt worden.
Hieronder volgt een mogelijk scenario van hoe de functie kan werken:
Available keys - books, authors - or type 'exit' to quit: books
Available keys - 0, 1, 2, 3, 4, 5, 6 - or type 'exit' to quit: books
Invalid key, retrying...
Available keys - 0, 1, 2, 3, 4, 5, 6 - or type 'exit' to quit: ..
Available keys - books, authors - or type 'exit' to quit: books
Available keys - 0, 1, 2, 3, 4, 5, 6 - or type 'exit' to quit: 3
Available keys - title, author, published, wordCount, genres - or type 'exit' to quit: title
{
value: "War and Peace",
}
Reached a leaf node, press enter to move back up the tree or type "exit" to quit [..] ..
Available keys - title, author, published, wordCount, genres - or type 'exit' to quit: genres
Available keys - 0 - or type 'exit' to quit: 0
{
value: "Historical Fiction",
}
Reached a leaf node, press enter to move back up the tree or type "exit" to quit [..] exit