|
Autor |
JavaScript Map falsch verstanden? |
|
Goswin
Senior  Dabei seit: 18.09.2008 Mitteilungen: 1747
Wohnort: Chile, Ulm
 | Themenstart: 2021-09-26
|
Warum funktioniert folgendes nicht ??
\sourceon JavaScript
\sourceoff
|
Profil
|
Triceratops
Aktiv  Dabei seit: 28.04.2016 Mitteilungen: 6372
Wohnort: Nordamerika
 | Beitrag No.1, eingetragen 2021-09-26
|
Das hängt nicht mit dem Konzept der Map, sondern mit dem Konzept des Arrays (bzw. Objekten) in JavaScript zusammen. Schau mal:
\sourceon(JavaScript)
let a = [1,2];
let b = [1,2];
console.log(a == b); // false
\sourceoff
Noch drastischer:
\sourceon(JavaScript)
console.log([1,2] == [1,2]); // false
\sourceoff
Analog:
\sourceon(JavaScript)
console.log({ x: 0 } == { x: 0 }); // false
\sourceoff
Deine Map hat zwar einen Key, den du als [2,3,4] definiert hast, aber der Aufruf mein_map.get([2,3,4]) verweist auf ein anderes Array, welches zwar dieselben Einträge hat, aber ein anderes, neu erstelltes Objekt ist.
Ich habe das Problem bisher immer mit Strings als Keys gelöst (und so wurde es mir auch empfohlen). Im obigen Beispiel ist ja a.toString() == b.toString() richtig.
Für ein Array von Zahlen* a ersetze also zum Setzen von Einträgen mein_map.set(a,...) durch mein_map.set(a.toString(),...), und bei get-Abfragen von Einträgen analog.
So gesehen geht leider ein Vorteil von Maps gegenüber herkömmlichen Objekten verloren, aber die Funktionen der Map-Klasse haben trotzdem einige Vorzüge und sind teilweise auch schneller.
Aber auch wenn du die Werte deiner Map vergleichen möchtest, die ja auch Arrays sind, wirst du auf die .toString()-Methode zurückgreifen müssen.
*oder Strings, in denen kein Komma vorkommt
|
Profil
|
Goswin
Senior  Dabei seit: 18.09.2008 Mitteilungen: 1747
Wohnort: Chile, Ulm
 | Beitrag No.2, vom Themenstarter, eingetragen 2021-09-26
|
\quoteon(2021-09-26 00:20 - Triceratops in Beitrag No. 1)
Für ein Array von Zahlen* a ersetze also zum Setzen von Einträgen mein_map.set(a,...) durch mein_map.set(a.toString(),...), und bei get-Abfragen von Einträgen analog.
\quoteoff
Das funktioniert jetzt bei mir. Vielen Dank, damit ist mein Grundproblem gelöst!
Aber du schreibst ja noch
\quoteon(2021-09-26 00:20 - Triceratops in Beitrag No. 1)
So gesehen geht leider ein Vorteil von Maps gegenüber herkömmlichen Objekten verloren, aber die Funktionen der Map-Klasse haben trotzdem einige Vorzüge und sind teilweise auch schneller.
\quoteoff
Bei mir scheinen "herkömmliche" Objekte freilich ganz unverträglich mit .toString() zu sein:
\sourceon JavaSript
\sourceoff
|
Profil
|
Scynja
Aktiv  Dabei seit: 23.02.2011 Mitteilungen: 522
Wohnort: Deutschland
 | Beitrag No.3, eingetragen 2021-09-26
|
Hallo Goswin,
du musst es nur richtig schreiben, dann geht es auch:
\sourceon JavaScript
const mein_obj = {
[[1, 2,3].toString()]: [2,3,5],
[[2, 3,4].toString()]: [3,5,7],
[[4, 5,6].toString()]: [5,7,11]
};
console.log(mein_obj[[1, 2,3].toString()])
\sourceoff
|
Profil
|
Triceratops
Aktiv  Dabei seit: 28.04.2016 Mitteilungen: 6372
Wohnort: Nordamerika
 | Beitrag No.4, eingetragen 2021-09-26
|
\sourceon(JavaScript)
const mein_obj = {
"1,2,3": [2,3,5],
"2,3,4": [3,5,7],
"4,5,6": [5,7,11]
};
\sourceoff
|
Profil
|
Goswin
Senior  Dabei seit: 18.09.2008 Mitteilungen: 1747
Wohnort: Chile, Ulm
 | Beitrag No.5, vom Themenstarter, eingetragen 2021-09-27
|
@scynja:
Gratuliere, du hast herausgefunden wie es richtig hingeschrieben wird (im w3schools-Tutorial steht das nicht). Vielen Dank!
[Die Antwort wurde nach Beitrag No.3 begonnen.]
|
Profil
|
Goswin
Senior  Dabei seit: 18.09.2008 Mitteilungen: 1747
Wohnort: Chile, Ulm
 | Beitrag No.6, vom Themenstarter, eingetragen 2021-09-27
|
\quoteon(2021-09-26 23:51 - Triceratops in Beitrag No. 4)
\sourceon(JavaScript)
const mein_obj = {
"1,2,3": [2,3,5],
"2,3,4": [3,5,7],
"4,5,6": [5,7,11]
};
\sourceoff
\quoteoff
@Triceratops:
Das kann man zwar machen, ist aber insofern gefährlich, als dass man beim Aufrufen der Keys mögliche Whitespaces genauso einfügen muss wie in der Definition des Map. Bei .toString() sind Whitespaces egal; nicht ohne Grund hatte man dir .toString() empfohlen. 😃
|
Profil
|
tactac
Senior  Dabei seit: 15.10.2014 Mitteilungen: 2537
 | Beitrag No.7, eingetragen 2021-09-27
|
\quoteon(2021-09-27 00:14 - Goswin in Beitrag No. 5)
@scynja:
Gratuliere, du hast herausgefunden wie es richtig hingeschrieben wird (im w3schools-Tutorial steht das nicht). Vielen Dank!
[Die Antwort wurde nach Beitrag No.3 begonnen.]
\quoteoff
Kann man natürlich auch hier in Erfahrung bringen (S. 310 im PDF).
|
Profil
|
Scynja
Aktiv  Dabei seit: 23.02.2011 Mitteilungen: 522
Wohnort: Deutschland
 | Beitrag No.8, eingetragen 2021-09-27
|
Nun, es ist auch der erste Google-Treffer (javascript reference object key by variable): https://stackoverflow.com/questions/11508463/javascript-set-object-key-by-variable
Ich kannte die Lösung aber bereits.
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3960
 | Beitrag No.9, eingetragen 2021-09-27
|
Auch die klassische "google nach der Fehlermeldung"-Methode hilft weiter.
[Die Antwort wurde vor Beitrag No.8 begonnen.]
|
Profil
|
Goswin
Senior  Dabei seit: 18.09.2008 Mitteilungen: 1747
Wohnort: Chile, Ulm
 | Beitrag No.10, vom Themenstarter, eingetragen 2021-10-02
|
\quoteon(2021-09-27 00:22 - Goswin in Beitrag No. 6)
Nicht ohne Grund hatte man dir .toString() empfohlen ...
\quoteoff
... vermutlich ohne auf folgende *grausige* Tatsache hinzuweisen,
\sourceon JavaScript
[[2,3],4].toString() === [2,[3,4]].toString() //gibt 'true' aus
\sourceoff
was unter anderem bei alert-Meldungen (implizites toString) uninformativ und irreführend ist. Also: für eigene Objekte besser nur JSON.stringify(obj) benutzen!
|
Profil
|
Goswin hat die Antworten auf ihre/seine Frage gesehen. Goswin hat selbst das Ok-Häkchen gesetzt. |
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2022 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|