Bestenliste

Bestenliste

Lernübung

Einführung

Erklärung

Neben primitiven Datentypen wie number und string gibt es in JavaScript noch einen weiteren wichtigen Datentyp: object. Objekte sind Sammlungen von Schlüssel-Wert-Paaren. Du kannst sie daher genauso verwenden wie das, was in anderen Sprachen oft Map oder Wörterbuch genannt wird.

In anderen Sprachen müssen alle Werte in einer Map oft denselben Datentyp haben. In JavaScript ist nur der Typ des Schlüssels eingeschränkt: Er muss ein string sein. Die Werte innerhalb eines Objekts können unterschiedliche Typen haben. Sie können primitive Typen wie Zahlen sein, aber auch Arrays, andere Objekte oder sogar Funktionen. Das macht Objekte sehr vielseitig, sodass sie auch zentrale Elemente der objektorientierten Programmierung (OOP) in JavaScript sind.

Im Folgenden konzentrieren wir uns auf Objekte als Sammlungen oder Maps. Andere Anwendungsfälle von Objekten behandeln wir in anderen Konzepten, siehe zum Beispiel Klassen.

Ein Objekt erstellen

Ein Objekt erstellst du mit geschweiften Klammern. Du kannst auch direkt einige Einträge angeben. Dazu gibst du zuerst den Schlüssel an, gefolgt von einem Doppelpunkt und dem Wert.

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;
  },
};

Das Komma nach dem letzten Eintrag ist in JavaScript optional.

Vielleicht fragst du dich, warum die Schlüssel nicht in Anführungszeichen stehen, obwohl sie Strings sein sollen. Das ist eine Kurzschreibweise. Wenn der Schlüssel den Namensregeln für einen JavaScript-Bezeichner folgt, kannst du die Anführungszeichen weglassen. Bei Schlüsseln mit Sonderzeichen im Namen musst du die übliche String-Notation verwenden.

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

Einen Wert abrufen

Es gibt zwei Möglichkeiten, den Wert für einen bestimmten Schlüssel abzurufen: die Punktnotation und die Klammernotation.

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

Die Punktnotation als Kurzschreibweise hat dieselbe Einschränkung wie das Weglassen der Anführungszeichen. Sie funktioniert nur, wenn der Schlüssel den Namensregeln für Bezeichner folgt.

Einen Wert hinzufügen oder ändern

Du kannst einen Wert mit dem Zuweisungsoperator = hinzufügen oder ändern. Auch hier stehen dir die Punkt- und die Klammernotation zur Verfügung.

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

Einen Eintrag löschen

Du kannst ein Schlüssel-Wert-Paar mit dem delete-Schlüsselwort aus einem Objekt löschen.

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

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

Prüfen, ob ein Schlüssel existiert

Mit der Methode hasOwnProperty kannst du prüfen, ob ein bestimmter Schlüssel in einem Objekt existiert.

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

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

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

Ein Objekt durchlaufen

Es gibt eine spezielle for...in-Schleife, um über alle Schlüssel eines Objekts zu iterieren.

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

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

Um subtile Fehler zu vermeiden, solltest du immer davon ausgehen, dass die for...in-Schleife die Schlüssel in einer beliebigen Reihenfolge besucht. Beachte außerdem, dass for...in geerbte Schlüssel in die Iteration einbezieht.

Anleitung

In dieser Übung implementierst du eine Möglichkeit, die Highscores für das beliebteste Spiel in deiner lokalen Spielhalle im Blick zu behalten.

Du hast 5 Funktionen zu implementieren, die sich größtenteils um die Manipulation eines Objekts drehen, das Highscores speichert.

1. Erstelle eine neue Bestenliste

Erstelle eine Funktion createScoreBoard, die ein Objekt erstellt, das als Bestenliste dient. Die Schlüssel dieses Objekts sind die Namen der Spieler, die Werte sind ihre Punktzahlen. Zu Testzwecken möchtest du direkt einen Eintrag in das Objekt aufnehmen. Dieser anfängliche Eintrag sollte The Best Ever als Spielernamen und 1000000 als Punktzahl enthalten.

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

2. Füge Spieler zu einer Bestenliste hinzu

Um einen Spieler zur Bestenliste hinzuzufügen, definiere die Funktion addPlayer. Sie akzeptiert 3 Parameter:

  • Der erste Parameter ist ein vorhandenes Bestenlistenobjekt.
  • Der zweite Parameter ist der Name eines Spielers als String.
  • Der dritte Parameter ist die Punktzahl als Zahl.

Die Funktion gibt dasselbe Bestenlistenobjekt zurück, das übergeben wurde, nachdem der neue Spieler hinzugefügt wurde.

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

3. Entferne Spieler aus einer Bestenliste

Wenn Spieler gegen die Regeln der Spielhalle verstoßen, werden sie manuell aus der Bestenliste entfernt. Definiere removePlayer, die 2 Parameter entgegennimmt:

  • Der erste Parameter ist ein vorhandenes Bestenlistenobjekt.
  • Der zweite Parameter ist der Name des Spielers als String.

Diese Funktion sollte den Eintrag für den angegebenen Spieler aus der Bestenliste entfernen und die Bestenliste anschließend zurückgeben. Wenn der Spieler von Anfang an nicht in der Bestenliste war, sollte mit der Bestenliste nichts passieren. Sie sollte unverändert zurückgegeben werden.

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

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

4. Erhöhe die Punktzahl eines Spielers

Wenn ein Spieler ein weiteres Spiel in der Spielhalle beendet, wird eine bestimmte Anzahl von Punkten zur bisherigen Punktzahl in der Bestenliste hinzugefügt. Implementiere updateScore, die 3 Parameter entgegennimmt:

  • Der erste Parameter ist ein vorhandenes Bestenlistenobjekt.
  • Der zweite Parameter ist der Name des Spielers, dessen Punktzahl erhöht werden soll.
  • Der dritte Parameter ist die Punktzahl, die du der gespeicherten Punktzahl hinzufügen möchtest.

Die Funktion sollte die Bestenliste nach der Aktualisierung zurückgeben.

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

5. Wende die Montags-Bonuspunkte an

Die Spielhalle führt montags eine separate Bestenliste. Am Ende des Tages erhält jeder Spieler auf dieser Bestenliste 100 zusätzliche Punkte.

Implementiere die Funktion applyMondayBonus, die eine Bestenliste entgegennimmt. Die Funktion fügt für jeden Spieler, der auf dieser Bestenliste steht, die Bonuspunkte hinzu. Anschließend wird die Bestenliste zurückgegeben.

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

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
JavaScript Exercism

Bereit, mit Bestenliste zu starten?

Melde dich bei Exercism an, um JavaScript mit 37 Konzepte159 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.