Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Objekt als statische Variable oder globale Variable
#1
Hallo,
ich möchte eine funktion für einen Gleitenden Mittelvert (MovingAverage) schreiben.
Dazu muss ich vorherige Werte speichern können.
Nun hab ich, weil es in Javascript offenbar keine statischen Variablen gibt ein Array als Globale Variable namens "maValues" definiert, auf welche ich in der Funktion zugreifen möchte. Dies gibt jedoch den Fehler: " TypeError: Cannot read properties of undefined (reading 'push')"
Offenbar kennt er die Methode push nicht, weil in der Funktion das Array nicht kreiert wurde.?
Ausserhalb der funktion wurde das Array offenbar schon kreiert, aber die Funktion scheint davon nichts mitbekommen zu haben.
Ich kann das Array aber nicht in der Funktion kreieren, sonst ist es bei jedem Aufruf wieder leer.
Wie kann man so was in JS realisieren?

Code:
var width = 3;
var maValues=[];

function ma(newValue) {
    var maSum = 0;
    var maValue = 0;
    var maLength = 0;
    maValues.push(newValue);       // Add the new value
    if (maValues.length > width) {
        maValues.shift();             // Remove the first value
    }
    maLength = maValues.length;
    maSum = 0;
    for (let j = 0; j < maValues.length; j++) {
        maSum += maValues[j];
    }
    console.log("MA length=" + maLength + "; MA sum=" + maSum);
    maValue = maSum / maLength;
    return maValue;
}
Zitieren
#2
Hallo

Also bei mir funktioniert dein Code.

Zwei wichtige Fragen:
1. In welcher Umgebung führst du deinen Code aus? - Im Browser, in nodeJs oder in einer Anderen Umgebung?
2. Wir rufst du denn die Funktion auf? - Also rufst du die Funktion direkt über "ma(<dein Wert>)" auf oder übergibst du die Funktion an eine andere Funktion und die ruft diese dann auf, etc...

Um hier zu helfen benötigen wir mehr informationen über den Kontext.

Der Fehler 
(26.05.2024, 09:47)Delphinis schrieb: " TypeError: Cannot read properties of undefined (reading 'push')"
Bedeutet übrigens nicht, dass er die Methode "push". nicht kennt, sondern dass in deinem Fall "maValues" den Wert "undefined" hat.
Das kann an vielen Verschiedenen Faktoren liegen.
Zitieren
#3
Hallo Delphinis und willkommen im Forum!
Schon beim Ansehen des Codes hatte ich keine Erklärung dafür, dass die Variable maValues innerhalb der Funktion nicht bekannt ist und auch ein Test bestätigt das: Schreibe ich einige Aufrufe direkt dahinter:
Code:
            return maValue;
        }
        ma(5);
        ma(7);
        ma(9);

funktioniert alles.
Mögliche Erklärung, warum bei dir nicht: Die Definition des Arrays ist irgend wie, z. B. in einer anderen Funktion, gekapselt und die Funktion liegt außerhalb. Prüfe deinen Code mal darauf.

Übrigens: OOP gibt es auch in Javascript, einschl. "static":
https://developer.mozilla.org/en-US/docs...ses/static

Edit: Andreas ist mir zuvor gekommen.
Glaube denen, die die Wahrheit suchen, und zweifle an denen, die sie gefunden haben.
(Andrι Gide (1869-1951), frz. Schriftst., 1947 Nobelpreis)
Zitieren
#4
Hallo zusammen,
die Anwort

" Schreibe ich einige Aufrufe direkt dahinter:
Code:
Code:
            return maValue;

        }

        ma(5);

        ma(7);

        ma(9);

funktioniert alles. "

hat mich darauf gebracht. Ich habe fälschlicherweise den Funktionsaufruf vor der Funktion gemacht.
Nun tut es:

Code:
var width = 3;
var maValues=[];

function ma(newValue) {
    var maSum = 0;
    var maValue = 0;
    var maLength = 0;
    maValues.push(newValue);       // Add the new value
    if (maValues.length > width) {
        maValues.shift();             // Remove the first value
    }
    maLength = maValues.length;
    maSum = 0;
    for (let j = 0; j < maValues.length; j++) {
        maSum += maValues[j];
    }
    console.log("MA length=" + maLength + "; MA sum=" + maSum);
    maValue = maSum / maLength;
    return maValue;
}

var values = [0, 0, 0, 10, 10, 10, 10, 0, 0, 0];


for (let i = 0; i < values.length; i++) {
    console.log("Moving average:" + ma(values[i]));
}

Vielen Dank, auch für den Hinweis von statischen Variablen
Zitieren
#5
Noch ein Nachtrag:
Zitat:Ich habe fälschlicherweise den Funktionsaufruf vor der Funktion gemacht.
Das ist nicht der Fehler, der Aufruf kann durchaus auch vor der Definition der Funktion stehen, dies funktioniert einwandfrei:
Code:
        var width = 3;
        var maValues = [];

        ma(5);
        ma(7);
        ma(9);
        function ma(newValue) {
            var maSum = 0;
            var maValue = 0;
            var maLength = 0;
            maValues.push(newValue);       // Add the new value
            if (maValues.length > width) {
                maValues.shift();             // Remove the first value
            }
            maLength = maValues.length;
            maSum = 0;
            for (let j = 0; j < maValues.length; j++) {
                maSum += maValues[j];
            }
            console.log("MA length=" + maLength + "; MA sum=" + maSum);
            maValue = maSum / maLength;
            return maValue;
        }
 
Stelle ich die Definition der Variablen dagegen hinter die Funktion funktioniert es nicht mehr:
Code:
        ma(5);
        ma(7);
        ma(9);
        function ma(newValue) {
            var maSum = 0;
            var maValue = 0;
            var maLength = 0;
            maValues.push(newValue);       // Add the new value
            if (maValues.length > width) {
                maValues.shift();             // Remove the first value
            }
            maLength = maValues.length;
            maSum = 0;
            for (let j = 0; j < maValues.length; j++) {
                maSum += maValues[j];
            }
            console.log("MA length=" + maLength + "; MA sum=" + maSum);
            maValue = maSum / maLength;
            return maValue;
        }
        var width = 3;
        var maValues = [];
Glaube denen, die die Wahrheit suchen, und zweifle an denen, die sie gefunden haben.
(Andrι Gide (1869-1951), frz. Schriftst., 1947 Nobelpreis)
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen:
1 Gast/Gäste