Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » JavaScript Map falsch verstanden?
Autor
Kein bestimmter Bereich J JavaScript Map falsch verstanden?
Goswin
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.09.2008
Mitteilungen: 1648
Wohnort: Chile, Ulm
  Themenstart: 2021-09-26 00:12

Warum funktioniert folgendes nicht ?? \sourceon JavaScript \sourceoff


   Profil
Triceratops
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 28.04.2016
Mitteilungen: 5771
Wohnort: Berlin
  Beitrag No.1, eingetragen 2021-09-26 00:20

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 Letzter Besuch: in der letzten Woche
Dabei seit: 18.09.2008
Mitteilungen: 1648
Wohnort: Chile, Ulm
  Beitrag No.2, vom Themenstarter, eingetragen 2021-09-26 22:37

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 23.02.2011
Mitteilungen: 433
Wohnort: Deutschland
  Beitrag No.3, eingetragen 2021-09-26 23:21

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 Letzter Besuch: in der letzten Woche
Dabei seit: 28.04.2016
Mitteilungen: 5771
Wohnort: Berlin
  Beitrag No.4, eingetragen 2021-09-26 23:51

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 18.09.2008
Mitteilungen: 1648
Wohnort: Chile, Ulm
  Beitrag No.5, vom Themenstarter, eingetragen 2021-09-27 00:14

@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 Letzter Besuch: in der letzten Woche
Dabei seit: 18.09.2008
Mitteilungen: 1648
Wohnort: Chile, Ulm
  Beitrag No.6, vom Themenstarter, eingetragen 2021-09-27 00:22

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2195
  Beitrag No.7, eingetragen 2021-09-27 00:50

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 23.02.2011
Mitteilungen: 433
Wohnort: Deutschland
  Beitrag No.8, eingetragen 2021-09-27 01:15

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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2679
  Beitrag No.9, eingetragen 2021-09-27 01:16

Auch die klassische "google nach der Fehlermeldung"-Methode hilft weiter. [Die Antwort wurde vor Beitrag No.8 begonnen.]


   Profil
Goswin
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.09.2008
Mitteilungen: 1648
Wohnort: Chile, Ulm
  Beitrag No.10, vom Themenstarter, eingetragen 2021-10-02 16:47

\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.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 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]