Berta Benz: reduce Ergebnisse in Objekte packen

Hallo,

bitte verzeiht, will hier nicht das ganze Forum zuspammen - da es sich mittlerweile um ein ganz anderes Problem handelt, erscheint mir ein neuer Beitrag gerechtfertigt:

Ich würde Strings in einem Array gern in Objekte mit zusätzlichen Informationen sozusagen "mutieren":

var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];

Eintraege = Eintraege.reduce(function(acc, curr) {
	var Wert = /* hier wird eine Funktion aufgerufen, die einen Zahlenwert (Integer) zurückgibt */;
	acc[curr] = Wert;
	return acc;
}, []);

Meine Lösung kommt aber zu dem semantisch falschen Ergebnis:

Eintraege = [Eintrag_1: /*Zahl*/, Eintrag_2: /*Zahl*/, Eintrag_3: /*Zahl*/]

Wie packe ich jedes der Resultate zusätzlich in ein Objekt

// Was ich mir vom Christkind wünsche
Eintraege = [{Eintrag_1: /*Zahl*/}, {Eintrag_2: /*Zahl*/}, {Eintrag_3: /*Zahl*/}]

?

[Die Variable Eintraege muss ein Array bleiben, da sie iterable bleiben muss (Eintraege[0], etc.)]

Danke!

  1. Ok, geht ganz einfach, zuerst Objekt erstellen und dann einfach zum accumulator pushen

    DOH!

    Tschuldigung die Störung

  2. Hallo Berta,

    du triffst ein paar falsche Annahmen.

    Die Variable Eintraege muss ein Array bleiben, da sie iterable bleiben muss

    Es gibt mehr iterables als das Array. Ein Objekt ist - wenn du neuere JavaScript-Versionen verwendest und auf Alt-Browser verzichten kannst - mit der for-of Schleife iterierbar (nur die Werte), bzw. mit getOwnPropertyNames() kommst Du auch an die Eigenschaftennamen heran und kannst damit iterieren. Aber es kann ja durchaus sein, dass das Array für Dich das beste ist.

    .reduce ist die falsche Wahl. Du möchtest jeden Array-Eintrag durch einen anderen ersetzen, da bietet sich eher .map an.

    var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];
    
    Eintraege = Eintraege.map(function(name) {
    	var Wert = getSomeInt(name);
    	var result = {};
      result[name] = Wert;
      return result;
    });
    

    Mit ECMAScript 2015 gibt es ein neues Feature: berechnete Eigenschaftsnamen. Und es gibt die Pfeilfunktionen, mit denen sich bspw. Callback-Funktionen kürzer formulieren lassen. Damit könnte das so aussehen (in allen aktuellen Browsern, d.h. nicht im Internet Explorer):

    var Eintraege = ["Eintrag_1", "Eintrag_2", "Eintrag_3"];
    
    Eintraege = Eintraege.map(name => ({ [name] : getSomeInt(name) }) );
    

    Die Klammern um das Objektliteral { [name] : getSomeInt(name) } sind nötig, weil der JavaScript-Interpreter sonst durcheinandergerät und denkt, man wolle einen Funktionsrumpf schreiben.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Rolf,

      Jep, die jüngsten neuen ECMAScript-Features machen aus Javascript meines Erachtens einen SO viel angenehmeren Zeitgenossen ;)

      Bezüglich iterables: ja, die Gewohnheit ist fürwahr ein Hund :D

      Danke auch für den Hinweis bezüglich der zusätzlichen Klammern um Objektliterals in diesem Zusammenhang, macht natürlich Sinn, da die Pfeilfunktion ja nach wie vor das ist, was der Name auch vermuten lässt - eine FUNKTION.

      LG.