Forum: PC-Programmierung Array in Javascript, Probleme mit der Ausgabe/Struktur


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wenn man mit Arrays arbeitet, werden die einzelnen Objekte im Array ja 
bei der Ausgabe häufig mit "" abgetrennt:
//die Werte von content sind nicht relevant. Es geht nur darum, dass content 8 Objekte beinhaltet.

var content = [5, 4, 8, 8, 6, 2, 4, 4];  //<-- Länge = 8

//test erhält hier so viele Objekte, wie content lang ist
var test = [];
    for (var i in content) {
    test.push(i);
}

die Ausgabe von test:
[ "0", "1", "2", "3", "4", "5", "6", "7" ]

An sich klappt alles. Der Code dient auch eher zum Zeigen.
Doch kann ich es irgendwie verhindern, dass Javascript bei der Ausgabe 
bzw. weiteren Nutzung von Arrays, die mit z.B. for-Schleifen entstehen 
und somit variabel sind, diese "" vor und nach jedem Objekt setzt?

Wenn ich ein Array erstelle mit festen Werten, also so:
var test2 = [0, 1, 2, 3, 4, 5, 6, 7];
und das dann mit console.log ausgebe, ist die Ausgabe gleich, aber ohne 
diese Anführungsstriche.

Mein Array verändert sich jedoch immer etwas, weswegen ich es eben mit 
einer for-Schleife erstelle.

Gibt es da eine Möglichkeit, dass eben diese "" nicht entstehen? Ich 
kann die nämlich nicht weiterverarbeiten. Ein String nimmt das JS-Tool 
leider nicht an. und die Anführungszeichen sind ebenfalls ein Problem.
Die gehören ja im Prinzip nicht zum Inhalt den ich übergebe. 
Dementsprechend kann ich das Array auch nicht wirklich manipulieren und 
die "" ausblenden.
Ich bin leider ziemlich auf Arrays angewiesen und kann wie gesagt nicht 
auf einen String ausweichen.

Vielleicht habt ihr ja einen Denkanstoß für mich :)

von Webhipster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
parseInt() existiert, aber dich interessiert doch nur die Laenge, 
richtig? Dann ignoriere den Inhalt und verwende .length.
var content = [5, 4, 8, 8, 6, 2, 4, 4];  //<-- Länge = 8

var test = Array();
for (var i = 0; i < content.length; i++) {
    test.push(i);
}

von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe das nur als Beispiel benutzt. Mich interessiert schon der 
Inhalt.

Im konkreten Fall habe ich ein Array mit date-Angaben. (Länge ist 
Variabel. also einige Daten werden darin gespeichert. Stammend aus einer 
Datenbank)
Also
[2020-06-26 12:00:00, 2020-06-27 12:00:00, 2020-06-28 12:00:00, ...]

Den Array füge ich mit einem anderen Zusammen. Sodass ich Datum-Wert 
Paare bekomme.  Es geht also eigentlich nicht um die Länge des Array. 
Nur nutze ich eben eine solche for-Schleife wie im Beispiel, da die 
Anzahl und der Inhalt der Quellelemente eben variabel ist.

Wenn ich diesen gemeinsamen Array ausgebe, habe ich das Problem mit den 
Anführungsstrichen.

Sorry falls ich zu wenig Infos am Anfang gegeben habe... bin etwas 
genervt von dem Problem weil es mich so aufhält :/

von Webhipster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also sowas in der Art?
>> "foo " + (new Date()).toISOString()
"foo 2020-06-27T22:36:37.968Z"
naja, wenn du Dinge concatenierst, dann ist dein Date-Datentyp weg und 
raus kommt ein String, und der wird nunmal durch Quotes eingeschlossen.

Vielleicht willst du stattdessen ein Tuple nehmen?
>> [123, (new Date()).toISOString()]
Array [ 123, "2020-06-27T22:36:40.497Z" ]

von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du hast es im Prinzip genau erfasst.
Aber das Format des Datums ist garnicht das Problem zum Glück. Also new 
Date()).toISOString() müsste ich nach meiner Einschätzung garnicht mehr 
anwenden.

Ich mache das aktuell so:
for(var i in data) {
  Abstand.push(data[i].Abstand);
  Zeit.push(data[i].Zeit);
}
--> hier bekomme ich aus einem Array mit mehreren Wertereihen die beiden 
Array heraus (das sind 2 von 5 Datenreihen die data beinhaltet).
var werte = [];
for(var i in Zeit) {
  werte.push(' {x: "' + Zeit[i] + '",y: ' + Abstand[i] + '}');
}
--> hier klatsche ich diese beiden Werte nun immer zusammen. Mit 
folgender Ausgabe:
 ["{x: "2020-04-01 06:39:13",y: 104.2}", "{x: "2020-04-04 06:39:07",y: 105.6}","{...}"] 

Die ist auch fast so wie ich sie will. Nur die "" vor den einzelnen 
Objekten zerschießen mir das Programm.
Es müsste so sein:
 [{x: "2020-04-01 06:39:13",y: 104.2}, {x: "2020-04-04 06:39:07",y: 105.6},{...}]  

von Webhipster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du pushst einen String.
[code]
  werte.push({'x': Zeit[i], 'y': Abstand[i]});
[code]
Das waere ein echtes dict, so wie es vermutlich auch dein 
endverarbeitendes Tool erwartet.

von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht ganz ob ich dich richtig verstehe.

Es stimmt, als String habe ich das auch schon ins richtige Format 
bekommen, aber mein Tool akzeptiert leider keinen String.
Es handelt sich um chart.js und das will als Datensatz mit x und y 
Werten immer nur einen Array... Allerdings bekomme ich den nicht richtig 
formatiert.

von Webhipster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
FloB schrieb:
> Die ist auch fast so wie ich sie will. Nur die "" vor den einzelnen
> Objekten zerschießen mir das Programm.
Ich denke eher, dein Date-String ist ein weiteres Problem.

Du willst wohl 
https://www.chartjs.org/docs/latest/charts/line.html#point verwenden, 
doch das erwartet jeweils integers. Stattdessen erscheint mir 
https://www.chartjs.org/docs/latest/axes/cartesian/time.html#input-data 
angemessen, das kann Date-Typen. Deine Rohdaten sind ggf. mit 
Date.parse() von String nach Date zu wandeln.

von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja du hast im Prinzip recht.

Aber diese data: ... Datensatz habe ich halt als Array und nicht direkt 
ins Script geschrieben, weil sich die genauen Daten eben täglich 
vermehren.

schreibe ich das so:
data: [ {x: "2020-04-01 06:39:13",y: 104.2}, {x: "2020-04-04 06:39:07",y: 105.6}, ...]
funktioniert die Anzeige. Allerdings habe ich die Werte natürlich direkt 
hingeschrieben

mache ich das gleiche aber als Array, geht es nicht mehr.
data: werte    (werte ist der Array den ich vorhin gebildet habe)

Der Werte Array den habe ich oben gebildet. Der ist identisch zu der 
manuellen Eingabe oben, allerdings mit den Anführungsstrichen zwischen 
den Objekten.
Ich denke da liegt das Problem

Das Date Format funktioniert sonst einwandfrei und er sieht die 
date-Werte auch als solche an und ordnet sie zeitlich richtig ein.

von Webhipster (Gast)


Bewertung
0 lesenswert
nicht lesenswert
FloB schrieb:
> Der Werte Array den habe ich oben gebildet. Der ist identisch zu der
> manuellen Eingabe oben, allerdings mit den Anführungsstrichen zwischen
> den Objekten.
> Ich denke da liegt das Problem

Und du bist sicher, dass du meine Aenderungsempfehlung von vorhin auch 
wirklich umgesetzt hast?
Webhipster schrieb:
>
>   werte.push({'x': Zeit[i], 'y': Abstand[i]});
> 

FloB schrieb:
> Das Date Format funktioniert sonst einwandfrei und er sieht die
> date-Werte auch als solche an und ordnet sie zeitlich richtig ein.
Auch bei ungleich langen Intervallen? Nunja, vielleicht parst die Lib 
wirklich alles, was wie ein Timestamp aussieht.

von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Webhipster schrieb:
> Auch bei ungleich langen Intervallen? Nunja, vielleicht parst die Lib
> wirklich alles, was wie ein Timestamp aussieht.

Das tatsächlich. Ich hatte das vor ein paar Wochen schon genauer 
probiert, aber der macht das perfekt, auch mit unterschiedlichen 
Intervallen.


Webhipster schrieb:
> werte.push({'x': Zeit[i], 'y': Abstand[i]});

Ich probiere das gerade noch. Ich bekomme zwar keinen Fehler, aber es 
wird auch kein Graph angezeigt. Ich weiß noch nicht ganz wieso, probiere 
noch aus

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du scheinst ein Verständnisproblem zu haben, was ein String, und was 
Objekte und sonstige Datentypen sind. Ein Objekt ist kein String, ein 
String ist kein Objekt. Eine Konsole kann dir kein Objekt zeigen, es 
muss dieses in eine für Menschen verständliche repräsentation umwandeln. 
Das Array  Objekt  etc. ist nicht wirklich eine Abfolge der Zeichen, 
die du da siehst.

von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Webhipster schrieb:
> Und du bist sicher, dass du meine Aenderungsempfehlung von vorhin auch
> wirklich umgesetzt hast?
> Webhipster schrieb:
>>>   werte.push({'x': Zeit[i], 'y': Abstand[i]});
>>

Ich hatte einen Schreibfehler darin...
Es funktioniert damit!!

Ich danke Dir vielmals! Auch noch um diese Uhrzeit ;)
Oh man..

von FloB (Gast)


Bewertung
0 lesenswert
nicht lesenswert
DPA schrieb:
> Du scheinst ein Verständnisproblem zu haben

Ja das ist auch nicht ausgeschlossen. Ich bin in der Welt von Javascript 
und PHP etc. noch recht neu und hab da noch nicht alles so richtig 
verstanden. Aber ich arbeite daran :/

Ich habe hier aber jetzt verstanden was falsch war, beim ersellen meines 
Array. Hoffe ich :P

von Bastler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
FloB schrieb:
> var content = [5, 4, 8, 8, 6, 2, 4, 4];  //<-- Länge = 8
>
> //test erhält hier so viele Objekte, wie content lang ist
> var test = [];
>     for (var i in content) {
>     test.push(i);
> }
>
> die Ausgabe von test:
> [ "0", "1", "2", "3", "4", "5", "6", "7" ]
>
> An sich klappt alles. Der Code dient auch eher zum Zeigen.
> Doch kann ich es irgendwie verhindern, dass Javascript bei der Ausgabe
> bzw. weiteren Nutzung von Arrays, die mit z.B. for-Schleifen entstehen
> und somit variabel sind, diese "" vor und nach jedem Objekt setzt?

Du bist völlig auf dem Holzweg. Dein Fehler fängt viel früher an:

Mit einer "for (var x in y)" iterierst Du über die Keys 
(Schlüssel) eines Objektes. Die Keys eines Objektes sind immer 
Strings (oder Symbole).

Was Du aber vermutlich willst, ist über die Werte des Arrays iterieren. 
Also musst Du "for (var x of y) schreiben.

Dann bekommst Du auch an keinen komischen Stellen Strings, wo Du es 
nicht erwartest.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.