Rolf B: Objekte mit Array mischen

Beitrag lesen

Hallo ebody,

grundsätzlich bist Du frei, ein Array zu erstellen, das Objekte enthält, deren Eigenschaften Arrays sind, worin sich wieder Objekte befinden... ad nauseam (oder insaniam, je nach dem...)

Du erstellt deine Objekte mit dem JavaScript-Konstrukt „Objektliteral“. Das ist völlig ok, aber deine Art es aufzuschreiben ist ungewöhnlich.

// Deins
   {"Farbe":"rot","Preis:":"8.000€"}

// Mein Vorschlag:
   { farbe: "rot", preis: 8000 }

Warum?

  • Objekteigenschaften sollten in JavaScript nach dem camelCase-Pattern[1] benannt sein, d.h. erster Buchstabe klein und wenn es ein zusammengesetzter Begriff ist, die Folgebegriffe groß. Beispiele: firstElement, getElementById
  • Eigenschaftennamen müssen nur in Anführungszeichen stehen wenn sie keinen erlaubten JavaScript-Namen bilden. Eine Eigenschaft "preis:" ist einfach nur umständlich zu handhaben, darum sollte der Doppelpunkt da raus
  • Zahlen sollte man als Zahlen speichern, wenn möglich. Ein Währungssymbol sollte getrennt gespeichert werden (sofern überhaupt Multiwährungsfähigkeit gebraucht wird), dann rechnet man einfacher mit den Preisen. Für die Ausgabe verwendet man dann eine Formatierungsfunktion (Intl.Numberformat, toLocaleString oder zur Not was handgemachtes)

Ob es für deinen Zweck sinnvoll ist, pro Marke ein eigenes Array zu bilden, hat dedlfix bereits bezweifelt. Wenn Du die Marke mit ans Auto-Objekt hängst und nur ein Array bildest, kannst Du bei Bedarf dieses Array filtern (z.B. mit der filter-Funktion, die zum Array-Prototyp gehört, oder mit einer Generatorfunktion. Eine Vorsortierung in ein Array pro Marke dürfte nur in Ausnahmefällen sinnvoll sein (sehr viele Autos und verschiedene Marken, häufiges Iterieren und Filtern auf Marke).

var autos = [
   { marke: "Dacia", farbe: "rot" , preis:  8000},
   { marke: "Dacia", farbe: "gelb", preis:  2000},
   { marke: "Dacia", farbe: "blau", preis: 17000},
   { marke: "Porsche", farbe: "silber", preis: 80000},
   { marke: "Mercedes", farbe: "pink", preis: 120000}
];

// 1. Markenindex bilden (als Eigenschaften eines marken-Objekts)
marken = { };
for (let a of autos) {
   console.log("Register " + a.marke);
   marken[a.marke] = 1;
}

// 2. Gefundene Marken auflisten
for (let m of Object.getOwnPropertyNames(marken).sort()) {
   console.log("Marke: " + m);
   for (let a of autos) {
      if (a.marke == m)
         console.log("   Farbe: " + a.farbe
            + ", Preis: "
            + a.preis.toLocaleString(undefined, { style:"currency", currency: "EUR"}))
   }
}

// for...of iteriert über die Elemente eines Arrays. 
// Es gibt natürlich auch andere Möglichkeiten, das zu tun...

Rolf

--
sumpsi - posui - clusi

  1. Andere Schreibkonventionen sind PascalCase, snake_case, kebab-case. Den Namen "Kebab Case" habe ich eben erst in der Wikipedia gesehen als ich eine Referenz zum casing suchte; Klassennamen in HTML folgen typischerweise dem kebab-case. ↩︎