j4nk3y: Array.from(obj)

Salve!

Hab da ne kurze frage zu Javascript.

Ich initialisiere ein Javscript Array durch var data = new Array(). Dieses wird nach und nach durch verschiedene AJAX Requests mit eindimensionalen JSON Objekten gefüllt, frei nach dem Motto data['index'] = JSON.parse(response). Eine Überprüfung mittels console.log(data) gibt etwas aus wie [1: Object, 2: Object, ...]. Soweit sogut.

Im nächsten Schritt bin ich nun dabei ein mehrdimensionales Array aus einer PHP zu holen, auch hier das selbe Spiel mit echo json_encode(myArr) das Array an die success Function des AJAX request schicken und mit data['index'] = JSON.parse(response) an data anhängen. Mit console.log(data) erhält man dann etwas wie [1: Object, 2: Object, 3: Array[2]]. Und mit console.log(typeof(data['3'])) bekommt man [Object].

Nun möchte ich mit Mustache.js über eben deieses (index 3) eine Schleife laufen lassen mit {{#3}}{{/3}}. Diese Methode funktioniert anscheinend nur bei Arrays und nicht bei Objekten (nur als Info). Darum wunderte ich mich warum es nicht bei data['3'] funktioniert, was laut Konsole ein Array/Objekt sein soll. Also kurzerhand in die Reference geschaut und Array.from() gefunden. Dies dann fix mit console.log(typeof(Array.from(data['3']))) überprüft und es wird Object ausgegeben.

Nun die große Frage. Warum wird Object ausgegeben?

Gruß
Jo

  1. Tach!

    Ich initialisiere ein Javscript Array durch var data = new Array().

    Kann man abkürzen zu var data = [];

    Dieses wird nach und nach durch verschiedene AJAX Requests mit eindimensionalen JSON Objekten gefüllt, frei nach dem Motto data['index'] = JSON.parse(response). Eine Überprüfung mittels console.log(data) gibt etwas aus wie [1: Object, 2: Object, ...]. Soweit sogut.

    Wenn du Strings wie in 'index' (mit Anführungszeichen) verwendest, erzeugst du Objekteigenschaften und keine Array-Einträge. Ich nehme an, du meinst/nimmst keine Strings sondern Zahlen.

    Im nächsten Schritt bin ich nun dabei ein mehrdimensionales Array aus einer PHP zu holen, auch hier das selbe Spiel mit echo json_encode(myArr) das Array an die success Function des AJAX request schicken und mit data['index'] = JSON.parse(response) an data anhängen. Mit console.log(data) erhält man dann etwas wie [1: Object, 2: Object, 3: Array[2]]. Und mit console.log(typeof(data['3'])) bekommt man [Object].

    Unterscheide zwischen einer Zahl als Array-Index und einem String, auch wenn Javascript für dich den String '3' in die Zahl 3 umwandelt.

    Nun die große Frage. Warum wird Object ausgegeben?

    Es gibt in Javascript keinen Datentyp Array. Arrays sind auch nur Objekte. Prüfen auf ein Array kann man mit Array.isArray(...)

    dedlfix.

    1. Salve,

      Ich initialisiere ein Javscript Array durch var data = new Array().

      Kann man abkürzen zu var data = [];

      Richtig, aber ist das nicht letztendlich egal?

      Dieses wird nach und nach durch verschiedene AJAX Requests mit eindimensionalen JSON Objekten gefüllt, frei nach dem Motto data['index'] = JSON.parse(response). Eine Überprüfung mittels console.log(data) gibt etwas aus wie [1: Object, 2: Object, ...]. Soweit sogut.

      Wenn du Strings wie in 'index' (mit Anführungszeichen) verwendest, erzeugst du Objekteigenschaften und keine Array-Einträge. Ich nehme an, du meinst/nimmst keine Strings sondern Zahlen.

      Hm ok. Dieses hab ich gefunden, welches auch einen 'string' als Index innerhalb eines Arrays nutzt. Worauf ich auch erst darauf gekommen bin, dass die iteration durch Mustache.js nur über Arrays funktioniert.

      Nun die große Frage. Warum wird Object ausgegeben?

      Arrays sind auch nur Objekte.

      Das ist mir auch klar.

      Es gibt in Javascript keinen Datentyp Array. Prüfen auf ein Array kann man mit Array.isArray(...)

      Aber wenn es keine Arrays in Javascript gibt, wieso sollte dann die Überprüfung .isArray() Sinn haben?

      Gruß
      Jo

      1. Tach!

        Kann man abkürzen zu var data = [];

        Richtig, aber ist das nicht letztendlich egal?

        Ja, aber warum unnötig lang schreiben, wenn es auch kurz geht?

        Dieses hab ich gefunden, welches auch einen 'string' als Index innerhalb eines Arrays nutzt.

        Auf der verlinkten Seite ist gar kein direkter Zugriff auf ein Array-Element enthalten.

        Es gibt in Javascript keinen Datentyp Array. Prüfen auf ein Array kann man mit Array.isArray(...)

        Aber wenn es keine Arrays in Javascript gibt, wieso sollte dann die Überprüfung .isArray() Sinn haben?

        Es gibt Arrays, aber es gibt keinen Datentyp Array. Alle Objekte, egal wie sie heißen, ergeben object wenn man typeof auf sie anwendet. Die Überprüfung Array.isArray() ist sinnvoll, um Arrays von anderen Objekten unterschieden zu können.

        Arrays haben gegenüber anderen Objekten eine Sonderstellung in Javascript, bis hin zu eigener Syntax, wie dem Array-Literal []. Trotzdem bilden sie keinen eigenständigen, mit typeof ermittelbaren Datentyp.

        Die Frage nach dem Warum bringt dich vermutlich nicht in deinem eigentlichen Problem weiter, welches auch immer das ist.

        dedlfix.

        1. Salve,

          Dieses hab ich gefunden, welches auch einen 'string' als Index innerhalb eines Arrays nutzt.

          Auf der verlinkten Seite ist gar kein direkter Zugriff auf ein Array-Element enthalten.

          Doch in der akzeptierten Antwort durch {{#comment}}{{comment}}{{/comment}}.

          Es gibt Arrays, aber es gibt keinen Datentyp Array. Alle Objekte, egal wie sie heißen, ergeben object wenn man typeof auf sie anwendet.

          Achso, sry habe ich falsch verstanden.

          Die Frage nach dem Warum bringt dich vermutlich nicht in deinem eigentlichen Problem weiter, welches auch immer das ist.

          Ich kann mit Mustache.js nicht über ein Element in meinem data Objekt iterieren. Obwohl dieses Element mit dem Array-Literal [] ausgegeben wird.

          Gruß
          Jo

          1. Tach!

            Auf der verlinkten Seite ist gar kein direkter Zugriff auf ein Array-Element enthalten.

            Doch in der akzeptierten Antwort durch {{#comment}}{{comment}}{{/comment}}.

            In der Variable data befindet sich ein Array. Mit #data wird wohl dem Mustache gesagt, dass es sich um ein Array handelt, das da in data liegt. Die Einträge in diesem Array sind Objekte. Mit #comment wird die Eigenschaft comment angesprochen und das # sagt, dass es sich bei dem inhalt dieser Eigenschaft um ein Array handelt. Die Elemente in diesem Array sind wiederum Objekte. Und die haben eine Eigenschaft namens comment.

            Es wird dabei dem Schnautzbart lediglich eine generelle Vorgehensweise mitgeteilt. An keiner Stelle wird dabei auf ein bestimtes Array-Element zugegriffen. Da ist also nirgendwo ein String für ein Array-Element-Zugriff verwendet worden.

            Ich kann mit Mustache.js nicht über ein Element in meinem data Objekt iterieren. Obwohl dieses Element mit dem Array-Literal [] ausgegeben wird.

            Mir scheint, du hast ein Problem, das eine Array-Element anzusprechen. In meinem kurzen Versuch gelang es mir mit data.3. Über das Array in diesem Element zu iterieren geht also so:

            {{#data.3}}
              {{wasauchimmer}}
            {{/data.3}}
            

            dedlfix.

          2. he Jo,

            Ich kann mit Mustache.js nicht über ein Element in meinem data Objekt iterieren. Obwohl dieses Element mit dem Array-Literal [] ausgegeben wird.

            wenn Du mit dem Schnauzer nicht klarkommst, probierst mal meine kleine Template-Engine hier in Aktion zum Bestücken einer Tabelle (siehe Quellcode, die Funktion heißt xr wie x-tended replace).

            MfG

        2. Hallo dedlfix,

          [var data = new Array()] kann man abkürzen zu var data = [];

          Richtig, aber ist das nicht letztendlich egal?

          Ja, aber warum unnötig lang schreiben, wenn es auch kurz geht?

          const zahlen = Array(32,16,8);
          const zahlen = [32,16,8]; // geht beides
          
          const zahlen = Array(3.1415);
          const zahlen = [3.1415] // hier geht nur das untere
          // weil der Konstuktor den übergebenen Wert als gewünschte Länge
          // des Arrays zu interpretieren versucht
          

          Das Wiki schreibt „Es ist grundsätzlich nicht empfehlenswert, Arrays unter Verwendung des Konstruktors Array zu erzeugen“ Geschrieben hat das @Orlok und ich glaube, der weiß wovon er spricht bzw. schreibt.

          Bis demnächst
          Matthias

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
          1. Salve,

            Das Wiki schreibt „Es ist grundsätzlich nicht empfehlenswert, Arrays unter Verwendung des Konstruktors Array zu erzeugen“ Geschrieben hat das @Orlok und ich glaube, der weiß wovon er spricht bzw. schreibt.

            Gut, dann wird das so gemacht. Das habe ich auch nicht bezweifelt.

            Gruß
            Jo