Inhalt
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á! 💪
Komplettlösung
function createDict(keys, values) {
return Object.fromEntries(keys.map((key, i) => [key, values[i] ?? null]));
}