JS: Verschränkte Objekt-Struktur mit Objekten teilw. befüllen



  • Wieder Kurioses aus der Zauber Web-Ecke...

    let rootObj = {};
    let nestedObj = {};
    let data = [{ eins: 1 }, { zwei: 2 }, { drei: 3 }];
    for (let key in data) {
      let value = data[key];
      switch (key) {
        case 'eins':
        case 'drei':
          nestedObj[key] = value;
          break;
        default:
          break;
      }
    }
    rootObj['child1'] = nestedObj;
    console.log(rootObj);
    

    Eigentlich sollte:

    {
      child1: {
        drei: 3,
        eins: 1
      }
    }
    

    ausgegeben werden (oder erst eins, dann drei, egal)... Die aktuelle Ausgabe ist jedoch:

    {
      child1: { ... }
    }
    

    Habe lange gebraucht, bis mir das Verhalten aufgefallen ist, die KI sagte, es sei alles ok... Was mache ich falsch, wie geht das in JS?

    Ich erwarte keine kanonische Antwort (bzw. Lösung), eine educated guess würde mir schon genügen.



  • @Anon-81275 sagte in JS: Verschränkte Objekt-Struktur mit Objekten teilw. befüllen:

    Ich erwarte keine kanonische Antwort (bzw. Lösung), eine educated guess würde mir schon genügen.

    Mein "educated guess" ist, dass du vermutlich bereits exakt die Ausgabe erhältst, die du erwartest. Ob { ... }etwas anderes ist als { drei: 3, eins: 1 } kann man erst sagen, wenn man weiß, wofür die "..." stehen. Vielleicht einfach mal dazu auch noch rootObj['child1'] ausgeben. Mein Bauchgefühl sagt mir, dass der console.log-Printer nur eine Ebene in das Objekt hinein geht, damit es übersichtlich bleibt. Es heißt ja auch "log" und nicht "to_json" oder sowas.



  • @Finnegan sagte in JS: Verschränkte Objekt-Struktur mit Objekten teilw. befüllen:

    dass du vermutlich bereits exakt die Ausgabe erhältst, die du erwartest

    Mir Dunning-Kruger zu unterstellen, ist natürlich abermals eine bewusste Provokation von dir...

    https://jsfiddle.net/muzygxLq/

    Genügt das, oder bedarf es noch einem Screenshot o. Ä.?

    Wenn ich die Werte dem nestedObj "zu Fuß" zuweise, dann geht es allerdings. Die Frage wäre also, weshalb dieses abweichende Verhalten (UB sagt man glaube ich im C++-Kontext...) hierbei auftritt.

    Vergleich:

    let rootObj = {};
    let nestedObj = {};
    let data = [{ eins: 1 }, { zwei: 2 }, { drei: 3 }];
    nestedObj['eins'] = 1;
    nestedObj['drei'] = 3;
    rootObj['child1'] = nestedObj;
    console.log(JSON.stringify(rootObj));
    console.log(rootObj);
    

    Ich glaube nicht, dass das ein Bug ist - aber, wer weiß das schon. 🤷♂ Ich verstehe auch nicht genau, weshalb es solche Funktionen wie structuredClone usw. gibt...



  • @Anon-81275 sagte in JS: Verschränkte Objekt-Struktur mit Objekten teilw. befüllen:

    @Finnegan sagte in JS: Verschränkte Objekt-Struktur mit Objekten teilw. befüllen:

    dass du vermutlich bereits exakt die Ausgabe erhältst, die du erwartest

    Mir Dunning-Kruger zu unterstellen, ist natürlich abermals eine bewusste Provokation von dir...

    Das ist genau der Schwachsinn, weshalb ich schon fast wieder keinen Bock habe zu antworten. Das war eine völlig neutrale Antwort von mir ohne mir genau den Code angesehen zu haben. Du hast schließlich nach simpler "educated guess"-Antwort gefragt, daher habe ich auch das erste geschrieben, was mir in den Sinn kam. Es ist nämlich nur anhand dieser Ausgabe nicht wirklich klar, dass sie nicht deiner Erwartung entspricht. Wie man da eine "Provokation" reinlesen kann, ist mir schleierhaft - allerdings gibt dich diese Reaktion sofort wieder als @CyborgBeta oder wer auch immer zu erkennen.

    Überleg dir mal, was das für ein Typ ist, über den du da mit for (let key in data) iterierst. Das ist kein Object, sondern ein Array, folglich sind die keys auch Integer-Indizes. Probier's mal mit:

    ...
    for (let value of data) {
      let key = Object.keys(value)[0];
    ...
    

    Wenn du nur den ersten Key via switch prüfen willst. Andernfalls musst du auch noch Object.keys(value) iterieren.