Διαδρομές
/
JavaScript
JavaScript
/
Ασκήσεις
/
Πίνακας υψηλών βαθμολογιών
Πίνακας υψηλών βαθμολογιών

Πίνακας υψηλών βαθμολογιών

Άσκηση εκμάθησης

Εισαγωγή

Επεξήγηση

Εκτός από τους πρωτογενείς τύπους δεδομένων όπως το number και το string, υπάρχει στη JavaScript και ένας άλλος σημαντικός τύπος δεδομένων που ονομάζεται object. Τα αντικείμενα είναι συλλογές από ζεύγη κλειδιών-τιμών. Ως τέτοια, μπορούν να χρησιμοποιηθούν με τον ίδιο τρόπο όπως αυτά που συχνά αποκαλούνται χάρτες ή λεξικά σε άλλες γλώσσες.

Σε άλλες γλώσσες, όλες οι τιμές σε έναν χάρτη πρέπει συχνά να έχουν τον ίδιο τύπο δεδομένων. Στη JavaScript, περιορίζεται μόνο ο τύπος του κλειδιού: πρέπει να είναι string. Οι τιμές μέσα σε ένα αντικείμενο μπορούν να έχουν διαφορετικούς τύπους. Μπορούν να είναι πρωτογενείς τύποι όπως αριθμοί, αλλά και πίνακες, άλλα αντικείμενα ή ακόμη και συναρτήσεις. Αυτό κάνει τα αντικείμενα εξαιρετικά ευέλικτα, ώστε να αποτελούν και βασικές οντότητες για τον αντικειμενοστρεφή προγραμματισμό (OOP) στη JavaScript.

Στη συνέχεια, θα επικεντρωθούμε στα αντικείμενα ως συλλογές ή χάρτες. Άλλες χρήσεις των αντικειμένων καλύπτονται σε άλλες έννοιες, δες π.χ. τις Κλάσεις.

Δημιουργία αντικειμένου

Δημιουργείς ένα αντικείμενο χρησιμοποιώντας άγκιστρα. Μπορείς επίσης να συμπεριλάβεις απευθείας κάποιες καταχωρίσεις. Γι' αυτό, γράψε πρώτα το κλειδί, έπειτα μία άνω και κάτω τελεία και μετά την τιμή.

const emptyObject = {};

const obj = {
  favoriteNumber: 42,
  greeting: 'Hello World',
  useGreeting: true,
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
  fruits: ['melon', 'papaya'],
  addNumbers: function (a, b) {
    return a + b;
  },
};

Το κόμμα στο τέλος, μετά την τελευταία καταχώριση, είναι προαιρετικό στη JavaScript.

Ίσως αναρωτιέσαι γιατί τα κλειδιά δεν περικλείονται σε εισαγωγικά, αν και υποτίθεται ότι είναι συμβολοσειρές. Αυτό είναι μια συντομευμένη σημειογραφία. Αν το κλειδί ακολουθεί τους κανόνες ονομασίας για ένα αναγνωριστικό της JavaScript, μπορείς να παραλείψεις τα εισαγωγικά. Για κλειδιά που περιέχουν ειδικούς χαρακτήρες στο όνομά τους, πρέπει να χρησιμοποιήσεις τον συνηθισμένο συμβολισμό με συμβολοσειρές.

const obj = {
  '1keyStartsWithNumber': '...',
  'key/with/slashes': '...',
  'key-with-dashes': '...',
  'key with spaces': '...',
  '#&()[]{}èä樹keyWithSpecialChars': '...',
};

Ανάκτηση τιμής

Υπάρχουν δύο τρόποι για να ανακτήσεις την τιμή ενός δεδομένου κλειδιού: ο συμβολισμός με τελεία και ο συμβολισμός με αγκύλες.

const obj = { greeting: 'hello world' };

obj.greeting;
// => hello world

obj['greeting'];
// => hello world

// Bracket notation also works with variables.
const key = 'greeting';
obj[key];
// => hello world

Η χρήση του συμβολισμού με τελεία ως συντόμευση έχει τον ίδιο περιορισμό με την παράλειψη των εισαγωγικών. Λειτουργεί μόνο αν το κλειδί ακολουθεί τους κανόνες ονομασίας των αναγνωριστικών.

Προσθήκη ή αλλαγή τιμής

Μπορείς να προσθέσεις ή να αλλάξεις μια τιμή χρησιμοποιώντας τον τελεστή ανάθεσης =. Και πάλι, έχεις διαθέσιμο τον συμβολισμό με τελεία και τον συμβολισμό με αγκύλες.

const obj = { greeting: 'hello world' };

obj.greeting = 'Hi there!';
obj['greeting'] = 'Welcome.';

obj.newKey1 = 'new value 1';
obj['new key 2'] = 'new value 2';

const key = 'new key 3';
obj[key] = 'new value 3';

Διαγραφή καταχώρισης

Μπορείς να διαγράψεις ένα ζεύγος κλειδιού-τιμής από ένα αντικείμενο χρησιμοποιώντας τη λέξη-κλειδί delete.

const obj = {
  key1: 'value1',
  key2: 'value2',
};

delete obj.key1;
delete obj['key2'];

Έλεγχος αν υπάρχει ένα κλειδί

Μπορείς να ελέγξεις αν υπάρχει ένα συγκεκριμένο κλειδί σε ένα αντικείμενο με τη μέθοδο hasOwnProperty.

const obj = { greeting: 'hello world' };

obj.hasOwnProperty('greeting');
// => true

obj.hasOwnProperty('age');
// => false

Διάσχιση ενός αντικειμένου

Υπάρχει ένας ειδικός βρόχος for...in για να διατρέξεις όλα τα κλειδιά ενός αντικειμένου.

const obj = {
  name: 'Ali',
  age: 65,
};

for (let key in obj) {
  console.log(key, obj[key]);
}
// name Ali
// age 65

Για να αποφύγεις λεπτά σφάλματα, καλό είναι να υποθέτεις πάντα ότι ο βρόχος for...in επισκέπτεται τα κλειδιά με τυχαία σειρά. Επίσης, να έχεις υπόψη σου ότι ο for...in συμπεριλαμβάνει κληρονομημένα κλειδιά στη διάσχισή του.

Οδηγίες

Σε αυτή την άσκηση, υλοποιείς έναν τρόπο να παρακολουθείς τις υψηλές βαθμολογίες για το πιο δημοφιλές παιχνίδι στην τοπική αίθουσα arcade.

Έχεις 5 συναρτήσεις να υλοποιήσεις, που σχετίζονται κυρίως με τον χειρισμό ενός αντικειμένου που κρατά υψηλές βαθμολογίες.

1. Δημιούργησε έναν νέο πίνακα υψηλών βαθμολογιών

Δημιούργησε μια συνάρτηση createScoreBoard που δημιουργεί ένα αντικείμενο το οποίο λειτουργεί ως πίνακας υψηλών βαθμολογιών. Τα κλειδιά αυτού του αντικειμένου θα είναι τα ονόματα των παικτών, οι τιμές θα είναι οι βαθμολογίες τους. Για λόγους δοκιμών, θέλεις να συμπεριλάβεις απευθείας μία καταχώριση στο αντικείμενο. Αυτή η αρχική καταχώριση θα πρέπει να αποτελείται από το The Best Ever ως όνομα παίκτη και το 1000000 ως βαθμολογία.

createScoreBoard();
// returns an object with one initial entry

2. Πρόσθεσε παίκτες σε έναν πίνακα βαθμολογίας

Για να προσθέσεις έναν παίκτη στον πίνακα υψηλών βαθμολογιών, όρισε τη συνάρτηση addPlayer. Δέχεται 3 παραμέτρους:

  • Η πρώτη παράμετρος είναι ένα υπάρχον αντικείμενο πίνακα βαθμολογίας.
  • Η δεύτερη παράμετρος είναι το όνομα ενός παίκτη ως συμβολοσειρά.
  • Η τρίτη παράμετρος είναι η βαθμολογία ως αριθμός.

Η συνάρτηση επιστρέφει το ίδιο αντικείμενο πίνακα βαθμολογίας που της πέρασες, αφού προσθέσει τον νέο παίκτη.

addPlayer({ 'Dave Thomas': 0 }, 'José Valim', 486373);
// => {'Dave Thomas': 0, 'José Valim': 486373}

3. Αφαίρεσε παίκτες από έναν πίνακα βαθμολογίας

Αν οι παίκτες παραβιάζουν τους κανόνες της αίθουσας arcade, αφαιρούνται χειροκίνητα από τον πίνακα υψηλών βαθμολογιών. Όρισε τη removePlayer, η οποία δέχεται 2 παραμέτρους:

  • Η πρώτη παράμετρος είναι ένα υπάρχον αντικείμενο πίνακα βαθμολογίας.
  • Η δεύτερη παράμετρος είναι το όνομα του παίκτη ως συμβολοσειρά.

Αυτή η συνάρτηση θα πρέπει να αφαιρεί την καταχώριση του συγκεκριμένου παίκτη από τον πίνακα και να επιστρέφει τον πίνακα στη συνέχεια. Αν ο παίκτης δεν ήταν εξαρχής στον πίνακα, δεν θα πρέπει να συμβεί τίποτα στον πίνακα. Θα πρέπει να επιστραφεί ως έχει.

removePlayer({ 'Dave Thomas': 0 }, 'Dave Thomas');
// => {}

removePlayer({ 'Dave Thomas': 0 }, 'Rose Fanaras');
// => { 'Dave Thomas': 0 }

4. Αύξησε τη βαθμολογία ενός παίκτη

Αν ένας παίκτης ολοκληρώσει άλλο ένα παιχνίδι στην αίθουσα arcade, ένα συγκεκριμένο ποσό πόντων θα προστεθεί στην προηγούμενη βαθμολογία στον πίνακα. Υλοποίησε τη updateScore, η οποία δέχεται 3 παραμέτρους:

  • Η πρώτη παράμετρος είναι ένα υπάρχον αντικείμενο πίνακα βαθμολογίας.
  • Η δεύτερη παράμετρος είναι το όνομα του παίκτη του οποίου η βαθμολογία θα πρέπει να αυξηθεί.
  • Η τρίτη παράμετρος είναι η βαθμολογία που θέλεις να προσθέσεις στην αποθηκευμένη υψηλή βαθμολογία.

Η συνάρτηση θα πρέπει να επιστρέφει τον πίνακα βαθμολογίας αφού γίνει η ενημέρωση.

updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}

5. Εφάρμοσε τους πόντους μπόνους της Δευτέρας

Η αίθουσα arcade κρατά έναν ξεχωριστό πίνακα βαθμολογίας τις Δευτέρες. Στο τέλος της ημέρας, κάθε παίκτης σε αυτόν τον πίνακα παίρνει 100 επιπλέον πόντους.

Υλοποίησε τη συνάρτηση applyMondayBonus που δέχεται έναν πίνακα βαθμολογίας. Η συνάρτηση προσθέτει τους πόντους μπόνους για κάθε παίκτη που είναι καταγεγραμμένος σε αυτόν τον πίνακα. Στη συνέχεια, ο πίνακας επιστρέφεται.

const scoreBoard = {
  'Dave Thomas': 44,
  'Freyja Ćirić': 539,
  'José Valim': 265,
};

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
JavaScript Exercism

Έτοιμος να ξεκινήσεις την άσκηση Πίνακας υψηλών βαθμολογιών;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.