Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo noch einmal.

Nachdem ich mein letztes Problem mit eurer Hilfe lösen konnte, habe ich nun ein weiteres.

Ich fülle einen zweidimensionalen Array und möchte diesen dann später, gefiltert, in einer Liste ausgeben.
 

Hier ist der Code:

                var artikelliste = {};

                $(document).on("click", ".BTartikel", function(){
                    $.post(
                        'controllers/artikelQuery.php',
                         {action: "loadArtikelwahl"},
                         function(result){

                            var i= 0;
                            result.forEach(function(entry){
                               inhalt = eval(entry[0]);
                               id = eval(entry[1]);
                               artikelliste[i] = {'id':id,'zeile2':inhalt[1].value,'inhalt':inhalt};
									
							   // alternativ auch bereits einzelne Zuordnung versucht, also:
							   // artikelliste[i]['id'] = id;
							   // artikelliste[i]['zeile2'] = zeile2;   usw.
                               i++;
                            });
                        }, 'json'
                    );
                });

                $(document).on("keyup", "#artikeltext", function(entry){
                            alert(artikelliste.length);
                    for(i=0;i<artikelliste.length; i++){

                    }
                })

           

alert(artikelliste.length); gibt "undefined" aus. Die Schleife wird folglich nicht durchlaufen.
Ich möchte offensichtlich nur die erste Dimension des Arrays einmal durchlaufen und dort soll dann geprüft werden, ob ein Eintrag (entry) in "zeile2" vorkommt. Bei Erfolgsfall soll die entsprechende Gesamtinfo (inhalt) in eine Liste geschrieben werden.

Wieso kann ich nicht die Länge der ersten Dimension mit length abfragen?

Hat jemand eine Idee oder einen Tip für mich?

Vielen Dank

 

 

Geschrieben (bearbeitet)

Das liegt daran, dass du kein Array, sondern ein Object hast.

 var artikelliste = {};

Die initialisierung eines Arrays sieht wie folgt aus:

 var artikelliste = [];

 

 

Kleiner Tipp am Rande: 

Du kannst einem Array mit Array.push() elemente hinzufügen, ohne einen Index ( [ i ] ) zu nutzen..

artikelliste.push({'id':id,'zeile2':inhalt[1].value,'inhalt':inhalt});

.push() hängt immer einen Eintrag ans Ende des Arrays an.

Darüber hinaus empfehle ich dir, dich mal mit den Grundlagen von JavaScript zu befassen.

Eine der ersten/besten Anlaufstellen zu einem Thema ist übrigens:

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array

 

//Edit:

Eine weitere, interaktive Hilfe liefert dir die JavaScript-Konsole deines Browsers. Nutze diese, um auf etwaige Fehler hingewiesen zu werden.

//Edit2:

Ich sehe, dass du häufig mit eval() arbeitest. Das mag gerade für dich eine angenehme Möglichkeit sein, dich unbedachter Typisierung zu entledigen, bietet einem (halbwegs) versierten Angreifer jedoch Tür und Tor in deine Anwendung. Denn eval() verarbeitet alles, ohne zu hinterfragen - also auch JavaScript Code im Stringformat. Ist also nicht wirklich sicher... Was man damit alles anstellen kann.... :träum:

eval("alert(\"test\")")

 

Bearbeitet von Memento
Geschrieben (bearbeitet)

Danke für die Hinweise.

Das mit dem Objekt ist eine Lösung, die ich in einem anderen Forum fand, nachdem ich stundenlang verzweifelt den Fehler suchte und nichts, aber auch gar nichts fand.

Bitte keine Rückschlüsse auf meine Kenntnisse aus den 20 Zeilen Code ziehen, die man hier sieht. Ich habe einfach den aktuellen Stand gepostet, nachdem ich das Ding mehrfach zerschnippelt, gelöscht und wieder zusammengebaut habe.
Die Idee mit dem Objekt war die letzte verzweifelte Tat, weil ich nicht weiterkam. Und die habe ich aus einem Forum von einem anderen User, der zwar nicht "Memento" heisst, sich aber auch ganz siecher war, dass seine Lösung funktioniert, und dass man mit seinem Weg durch eine Objekt-Initialisierung, die Anzahl der Elemente mittels length auslesen kann.

Da nicht, aber auch gar nichts bisher funktionierte, habe ich es einfach mal versucht und nachdem dies Scheiterte hier den letzten Stand gepostet.

Ich weis was ein Objekt ist, ich weis was ein Array ist. Ich programmiere seit 20 Jahren Beruflich, schrieb Codes in PHP, C#, Visual Basic, Batch-Programmierung, kenne OOP und Prozedurale Programmierung. Die ersten Programme schrieb ich auf einem C64.

Es mangelt mir wirklich nicht an Grundlagen. Eher bin ich einfach wieder etwas raus, weil ich in den letzten Jahren nicht mehr viel Programmiert hatte, da ich andere berufliche Projekte hatte. Ich hatte oben auch bereits in den Kommentaren angedeutet, dass ich es bereits mit ganz normalen Arrays probiert habe. OK, war nur am Rande und mein Fehler dass es nicht offensichtlich ist.

Also bitte nicht den Fehler machen, jemanden an 20 Zeilen Code zu beurteilen, die nach 30 Stunden Frust und Verzweiflung herauskamen. Alleine meine Hauptdatei enthält 500 Zeilen Javascript-Code der wunderbar funktioniert.

Es gibt mehrere Stellen an denen ich genauso per AJAX übermittelte JSON-Strings (ohne eval) problemlos in Arrays umwandelte. Nur hier eben nicht. Irgendwo war vermutlich ein falsches Zeichen benutzt worden. Deswegen muss ich aber nicht erneut Grundlagen erlernen!

Ich bin dankbar für die Hinweise, haben sie mir zumindest bestätigt, dass das Objekt ein Holzweg war.
Ich habe den ganzen Kram jetzt gelöscht und wieder einmal erneut programmiert und diesmal klappte es. Scheinbar muss irgendwo ein klitzekleiner Fehler gewesen sien, den ich übersah.

Eval entstand übrigens aus einem anderen Problem, weil ich mit JSON.parse an eben dieser Stelle ebenfalls Probleme hatte, die ich in hunderten anderen Codezeilen nicht hatte.
Um Eval kümmere ich mich auch noch. Das hier ist ja auch nicht das finale Ergebnis.

Dies ist jetzt mein aktueller Code (Ja, eval ist noch drin, darum kümmere ich mich als nächstes ;) )

                var artikelliste = [];

                $(document).on("focus", ".zeile2", function(){
                    if(this.value!=''){
                        $('#BTartikel'+id).fadeIn(500);
                    }
                });

                $(document).on("blur", ".zeile2", function(){
                        $('#BTartikel'+id).fadeOut(500);
                });

                $(document).on("click", ".BTartikel", function(){
                    $.post(
                        'controllers/artikelQuery.php',
                         {action: "loadArtikelwahl"},
                         function(result){

                            var i= 0;
                            result.forEach(function(entry){
                               inhalt = eval(entry[0]);
                               id = eval(entry[1]);
                               artikelliste[i] = [];
                               artikelliste[i]['id'] = id;
                               artikelliste[i]['zeile2'] = inhalt[1].value;
                               artikelliste[i]['inhalt'] = inhalt;
                               i++;
                            });
                            $('#monitorWrapper').fadeOut(500);
                            $('#artikelliste').fadeIn(500);
                        }, 'json'
                    );
                });

                $(document).on("keyup", "#artikeltext", function(entry){
                    alert(artikelliste.length);
                })

Der funktioniert. Der Array lässt sich zählen.

 

Bearbeitet von Hamunsch
Geschrieben (bearbeitet)
vor 31 Minuten schrieb Hamunsch:

Es mangelt mir wirklich nicht an Grundlagen. Eher bin ich einfach wieder etwas raus, weil ich in den letzten Jahren nicht mehr viel Programmiert hatte, da ich andere berufliche Projekte hatte

Dann ist der Hinweis deine Kenntnisse aufzufrischen doch berechtigt.

vor 31 Minuten schrieb Hamunsch:

Deswegen muss ich aber nicht erneut Grundlagen erlernen!

vor 31 Minuten schrieb Hamunsch:

Also bitte nicht den Fehler machen, jemanden an 20 Zeilen Code zu beurteilen, die nach 30 Stunden Frust und Verzweiflung herauskamen.

ok!

Im anderen Thread haben wir ja schon festgestellt, dass deine Schnittstelle die Daten nicht wirklich sauber ans Frontend übergibt. Ich würde einfach da ansetzen, dann muss dein JSON nur ein einziges mal vom Client geparst werden und alles ist gut.

Bearbeitet von PVoss
Geschrieben

Hallo Hamunsch,

ich muss, so glaube ich, gerade ein paar Dinge erläutern:

vor 1 Stunde schrieb Hamunsch:

Bitte keine Rückschlüsse auf meine Kenntnisse aus den 20 Zeilen Code ziehen, die man hier sieht. Ich habe einfach den aktuellen Stand gepostet, nachdem ich das Ding mehrfach zerschnippelt, gelöscht und wieder zusammengebaut habe.

Rückschlüsse auf den Kenntnisstand (hier: in Sachen JavaScript) kann man bei vielen Personen teilweise schon an einer Hand voll Zeilen ziehen. Und es müssen nicht unbedingt Code-Zeilen sein.

Viele Leute, die vorher mit einer (stark) typisierten Sprache gearbeitet haben und jetzt zu einer schwach oder gar untypisierten Sprache wechseln, haben große Probleme mit dem Ein-/Umstieg. Im Übrigen schrieb ich nicht von "Grundlagen", sondern von "Grundlagen von JavaScript", denn offensichtlich sind diese nicht (mehr) ausreichend vorhanden. Der Code von "Nicht-Memento" aus dem anderen Forum hätte eventuell funktionieren können. Kann ich nicht beurteilen, weil ich den Code nicht kenne. Ist mir auch egal. Deine Interpretation des Codes hat nicht funktioniert - also bin ich eingeschritten.

Im Übrigen halte ich mich nicht für den Über-Mega-Gott in Sachen JavaScript oder Programmierung ansich - auch wenn ich auch seit gut 15 Jahren programmiere. Nur weil man etwas 15 oder 20 Jahre lang macht, heisst es nicht, dass man alles kann und alles richtig macht. Ich lerne täglich neue Dinge - und fühle mich dadurch in meiner Entwickler-Ehre auch nicht gekränkt, wenn sich mal was positives in den Basics tut. Zumal sich die angewandte Sprache auch weiterentwickelt.

Zurück zum Thema:

vor 2 Stunden schrieb Hamunsch:

Eval entstand übrigens aus einem anderen Problem, weil ich mit JSON.parse an eben dieser Stelle ebenfalls Probleme hatte, die ich in hunderten anderen Codezeilen nicht hatte.

Um Eval kümmere ich mich auch noch. Das hier ist ja auch nicht das finale Ergebnis.

Wenn du die Daten bereits als JSON (Server -> Client) übergibst, musst du sie nicht mehr parsen. Und ein eval() entfällt dann auch.Ich denke, dass dein Problem mit dem fehlerhaften JSON nicht am Client, sondern eher beim Controller/Server zu suchen ist.

Gern stehe ich - und auch die anderen User dieses tollen Forums - dir weiterhin tatkräftig zur Seite, sofern wir uns auf einem gewissen, professionellen Niveau einfinden können. Wenn dir jemand einen Tipp gibt oder Kritik an deinen Methoden äußert, fühl dich davon nicht gleich angegriffen sondern versuch mal, dies umzusetzen.

Schönen Gruß,

Memento

Geschrieben (bearbeitet)

Besser ist es, JSON nur zu vewernden, wenn man es wirklich braucht. Und vor allem nicht statisch so etwas wie

meinArray.push({"irgend":"ein","json":"object"});

machen. Das mag zwar funktionieren, aber ist nicht wirklich gut. Stell dir vor, es ändert sich darin was, dann muss man manuell tausende Zeilen durchgehen um den Code anzupassen.

Stattdessen würde ich versuchen, "Klassen" abzubilden, wie z.B.:

var Artikel = function(id, zeile2, inhalt) {
  this.id = id;
  this.zeile2 = zeile2;
  this.inhalt = inhalt;
};

(Ich schreibe "Klasse" mit Absicht in Anführungszeichen, weil es keine "richtigen Klassen" sind, aber man etwas daraus basteln kann, das sich so wie Klassen verhält. Es gibt auch ein paar weitere Möglichkeiten, darauf möchte ich hier aber nicht eingehen. Aber du solltest dich damit auseinander setzen, wenn du weiter JS entwickeln möchtest.)

Jetzt kannst du easy Objekte an deinen Array anhängen:

var artikelliste = [];

artikelliste.push(new Artikel(3, "foo", "bar"));
artikelliste.push(new Artikel(4, "hallo", "welt"));

Wenn du anschließend wirklich etwas wie einen JSON benötigst, z.B. um es an einen Server zu senden, kannst du dein Array mit den Objekten in ein JSON umwandeln:

var artikellisteAlsJson = JSON.stringify(artikelliste);

Und bitte niemals, niemals, niemals eval() verwenden. In 99% der fälle resultiert das aus schlechtem Code und nicht, weil es wirklich benötigt wird.

/Edit: Um JSON, zB vom Server, in Objekte zurück zu wandeln, kannst du JSON.parse(jsonString); verwenden. Aber bitte kein eval() ;)

Bearbeitet von pr0gg3r

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...