Codewars Lösung | Dictionary from two lists


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|13. Oktober 2024
3 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

Die Fakten:

Plattform:codewars.com
Name:Dictionary from two lists
Level:7 kyu
Sprache:JavaScript

Beschreibung:

There are two lists, possibly of different lengths. The first one consists of keys, the second one consists of values. Write a function createDict(keys, values) that returns a dictionary created from keys and values. If there are not enough values, the rest of keys should have a None (JS null)value. If there not enough keys, just ignore the rest of values.

Example 1:

keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3]
createDict(keys, values) # returns {'a': 1, 'b': 2, 'c': 3, 'd': None}
keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3]
createDict(keys, values) // returns {'a': 1, 'b': 2, 'c': 3, 'd': null}

Example 2:

keys = ['a', 'b', 'c']
values = [1, 2, 3, 4]
createDict(keys, values) # returns {'a': 1, 'b': 2, 'c': 3}
keys = ['a', 'b', 'c']
values = [1, 2, 3, 4]
createDict(keys, values) // returns {'a': 1, 'b': 2, 'c': 3}

Quelle: codewars.com

Lösung

Pseudo-Code

Es gibt wie immer viele Varianten, hier ist eine meiner.

Erst die Lösungsschritte in Pseudo-Code. Los geht’s:

Lösungsschritte
Schritt 1

Als Erstes loopen wir durch das keys-Array.

Schritt 2

Für jedes Element in den keys erstellen wir ein Array mit dem aktuellem key und dem dazugehörigen value.

Schritt 3

Sollte es keinen value zum aktuellen key geben, ersetzen wir undefined durch null.

Schritt 4

Aus dem so erhaltenen Array können wir uns dann das Objekt generieren.

Schritt 5

Zum Schluss noch das Ergebnis zurückgeben.

Code

Geil. Übersetzen wir unseren Pseudo-Code in JavaScript:

Lösungsschritte
Meine erste Zeile:
function createDict(keys, values) {

Die Zeile habe ich unverändert aus dem Codewars-Beispiel übernommen.

Dann der Loop durch das keys-Array:
keys.map((key, i) => [key, values[i]]);

Da wir am Ende genauso viele Elemente haben wollen, wie es Elemente im keys-Array gibt, drängt sich hier ein Loop mit .map() auf.

Für jedes Element in den keys erstellen wir ein Array mit aktuellem key und dem dazugehörigen value.

Dann bekommen wir also folgendes 2-dimensionales Array:

[[a, 1], [b, 2], [c, 3], [d, undefined]]

Sollte es zu einem aktuellen key keinen value geben, ersetzen wir undefined durch null:
keys.map((key, i) => [key, values[i] ?? null]);

Dafür eignet sich hier wunderbar der sogenannte Nullish coalescing operator (??)! (Wobei in diesem Fall auch ein logisches ODER (||) vollkommen ausreichen würde)

Unser 2-dimensionales Array sieht dann also so aus:

[[a, 1], [b, 2], [c, 3], [d, null]]

Jetzt noch aus dem 2-dimensionalen Array ein Objekt generieren:
Object.fromEntries(keys.map((key, i) => [key, values[i] ?? null]));

Dafür gibt es in JavaScript seit ES10 (2019) die coole Methode Object.fromEntries().

Zum Schluss nur noch das Ergebnis zurückgeben:
return Object.fromEntries(keys.map((key, i) => [key, values[i] ?? null]));

Da wir hier nur eine Zeile haben, setzen wir hier also einfach nur noch unser return davor.

Voilá! 💪

Fragen?

Komplettlösung
function createDict(keys, values) {
  return Object.fromEntries(keys.map((key, i) => [key, values[i] ?? null]));
}

Feedback

Schreib mir!