Ich habe Probleme, alle Elemente eines Arrays hinzuzufügen und zu mitteln. Wie würde ich das tun und es mit dem Code implementieren, den ich derzeit habe? Die Elemente sollen so definiert werden, wie ich es unten habe.
<script type="text/javascript">
//<![CDATA[
var i;
var elmt = new Array();
elmt[0] = "0";
elmt[1] = "1";
elmt[2] = "2";
elmt[3] = "3";
elmt[4] = "4";
elmt[5] = "7";
elmt[6] = "8";
elmt[7] = "9";
elmt[8] = "10";
elmt[9] = "11";
// Problem here
for (i = 9; i < 10; i++){
document.write("The sum of all the elements is: " + /* Problem here */ + " The average of all the elements is: " + /* Problem here */ + "<br/>");
}
//]]>
</script>
javascript
arrays
average
Jonathan Miller
quelle
quelle
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
wäre so viel schöner.Antworten:
Durchlaufen Sie einfach das Array, da Ihre Werte Zeichenfolgen sind, müssen sie zuerst in eine Ganzzahl konvertiert werden. Und Durchschnitt ist nur die Summe der Werte geteilt durch die Anzahl der Werte.
quelle
for(var i = 0; i < elmt.length; i++;)
durchfor(var i = 0, l = elmt.length; i < l; i++)
sum += parseInt(elmt[i], 10);
Annahme , dass elmt [i] von der Basis 10 ist. LinkEine Lösung, die ich für eleganter halte:
quelle
sum/times.length
Schritt):var avg = times.reduce(function(p,c,i){return p+(c-p)/(i+1)},0);
times.reduce((a,b) => (a+b)) / times.length;
ES6
quelle
Array.prototype.average = function () { var sum = 0, j = 0; for (var i = 0; i < this.length, isFinite(this[i]); i++) { sum += parseFloat(this[i]); ++j; } return j ? sum / j : 0; };
NaN
.Berechnung des Durchschnitts (Mittelwerts) mit Reduce und ES6:
quelle
Im Allgemeinen ist die durchschnittliche Verwendung einer Einzeiler-Reduzierung so
speziell auf die gestellte Frage
Eine effiziente Version ist wie
Verstehen Sie die Reduzierung von Javascript-Arrays in 1 Minute http://www.airpair.com/javascript/javascript-array-reduce
Wie gotofritz hervorhob, überspringt Array.reduce undefinierte Werte. Also hier ist ein Fix:
quelle
elements.length!=0?elements.length:1
kann auch so geschrieben werden:elements.length || 1
das ist kürzer und leichter zu lesen.Stellen wir uns vor, wir haben eine Reihe solcher Ganzzahlen:
Der Durchschnitt wird mit der folgenden Formel erhalten
A = (1 / n) Σxi (mit i = 1 bis n) ... Also: x1 / n + x2 / n + ... + xn / n
Wir teilen den aktuellen Wert durch die Anzahl der Werte und addieren das vorherige Ergebnis zum zurückgegebenen Wert.
Die Signatur der Reduzierungsmethode lautet
Die Rückruffunktion reduziert die folgenden Parameter:
Der Parameter der zweiten Reduzierung ist der Standardwert ... (Wird verwendet, wenn das Array leer ist ).
Die durchschnittliche Reduktionsmethode lautet also:
Wenn Sie möchten, können Sie eine separate Funktion erstellen
Und dann beziehen Sie sich einfach auf die Signatur der Rückrufmethode
Oder erweitern Sie den Array-Prototyp direkt.
Es ist möglich, den Wert bei jedem Aufruf der Reduktionsmethode zu teilen.
Oder noch besser mit dem zuvor definierten Array.protoype.sum ()
Methode, optimieren Sie den Prozess, indem Sie die Division nur einmal aufrufen :)
Dann auf jedem Array-Objekt des Bereichs:
NB: Ein leeres Array mit der Rückgabe eines NaN-Wunsches ist aus meiner Sicht korrekter als 0 und kann in bestimmten Anwendungsfällen nützlich sein.
quelle
Sie können auch lodash , _.sum (Array) und _.mean (Array) im Math-Teil verwenden (haben auch andere praktische Dinge).
quelle
Nicht der schnellste, aber der kürzeste und in einer Zeile verwendete map () & redu ():
quelle
[7,14,21].reduce((avg,e,i,arr)=>avg+e/arr.length,0);
aber mit unterschiedlichem Verhalten auf leerem Array. Wenn Sie möchten, dass das Ergebnis auf einem leeren Array leer ist:[].reduce((a,e,i,arr)=>(a?a:0)+e/arr.length,"")
for (var avg = 0, length = i = arr.length; i--;) avg += arr[i] / length
Viel klarer, kürzer und viel schnellerEin hinterhältiger Weg, wie Sie es tun könnten, obwohl es die Verwendung von (dem viel gehassten) eval () erfordert.
Ich dachte nur, ich würde dies als eine dieser "außerhalb der Box" -Optionen posten. Du weißt nie, die List könnte dir einen Punkt geben (oder wegnehmen).
quelle
eval()
Problem, das ich sehen kann, dass Sie sicherstellen müssen, dass das Array nur Zahlen enthält (was natürlich auch für alle anderen Antworten hier gilt). Nicht numerische Einträge stürzen mit einemReferenceError
oder abSyntaxError, except nested arrays of numbers which introduce
und verursachen eine falsche numerische Summe. Und natürlich kann in serverseitiger JS, z. B. node.js, natürlicheval()
Sicherheitsprobleme auftreten. Dies sieht jedoch perfekt für alle gut strukturierten clientseitigen Anwendungen aus.eval()
wie folgtIch verwende diese Methoden in meiner persönlichen Bibliothek:
BEARBEITEN: Um sie zu verwenden, fragen Sie einfach das Array nach seiner Summe oder seinem Durchschnitt, wie zum Beispiel:
quelle
In ES6-fähigen Browsern kann diese Polyfüllung hilfreich sein.
Sie können gleiche Call - Methode teilen zwischen
Math.sum
,Math.avg
undMath.max
, wieSie können Math.sum als verwenden
oder wenn Sie ein Array zum Zusammenfassen haben, können Sie verwenden
so wie
quelle
Array.prototype
, halte ich das Hinzufügen eines Themas zumMath
Objekt für eine bessere Wahl - sie sind alle "Zahlenhandler".Hier ist eine schnelle Ergänzung zum "Math" -Objekt in Javascript, um einen "Durchschnitts" -Befehl hinzuzufügen !!
Dann habe ich diesen Zusatz zum "Math" -Objekt, um die Summe zu erhalten!
Also ist alles was du tust
Und wo ich das Platzhalter-Array platziere, übergeben Sie einfach Ihre Variable (Die Eingabe, wenn es sich um Zahlen handelt, kann eine Zeichenfolge sein, da sie auf eine Zahl analysiert wird!)
quelle
Setzen Sie Ihren for-Schleifenzähler auf 0 ... Sie erhalten Element 9 und dann sind Sie fertig, wie Sie es jetzt haben. Die anderen Antworten sind grundlegende Mathematik. Verwenden Sie eine Variable, um Ihre Summe zu speichern (die Zeichenfolgen müssen in Ints umgewandelt werden) und durch Ihre Array-Länge zu dividieren.
quelle
Definieren Sie zunächst alle Variablen, die wir verwenden möchten. Sie werden feststellen, dass ich für das
numbers
Array[]
im Gegensatz zur Konstruktormethode die Literalschreibweise von verwendearray()
. Außerdem verwende ich eine kürzere Methode, um mehrere Variablen auf 0 zu setzen.Als nächstes fülle ich mein leeres Zahlenarray mit den Werten 0 bis 11. Dies bringt mich zu Ihrem ursprünglichen Ausgangspunkt. Beachten Sie, wie ich auf das Array drücke
count++
. Dadurch wird der aktuelle Wert von count verschoben und dann für das nächste Mal erhöht.Zuletzt führe ich eine Funktion "für jede" der Zahlen im Zahlenarray aus. Diese Funktion verarbeitet jeweils eine Nummer, die ich im Funktionskörper als "n" identifiziere.
Am Ende können wir sowohl den
sum
Wert als auch denavg
Wert an unsere Konsole ausgeben , um das Ergebnis zu sehen:Sehen Sie es online in Aktion unter http://jsbin.com/unukoj/3/edit
quelle
Ich baue nur auf Abdennour TOUMIs Antwort auf. Hier sind die Gründe warum:
1.) Ich stimme Brad zu, ich halte es nicht für eine gute Idee, ein Objekt zu erweitern, das wir nicht erstellt haben.
2.)
array.length
ist in Javascript genau zuverlässig, ich bevorzugeArray.reduce
weila=[1,3];a[1000]=5;
,a.length
würde jetzt zurückkehren1001
.quelle
Dann :
quelle
In immergrünen Browsern können Sie Pfeilfunktionen verwenden
avg = [1,2,3].reduce((a,b) => (a+b);
Wenn es 100.000 Mal ausgeführt wird, ist der Zeitunterschied zwischen dem for-Loop-Ansatz und dem Reduzieren vernachlässigbar.
quelle
console.time
&console.timeEnd
Durchschnittlich kürzester Einzeiler:
Summe kürzester Einzeiler:
quelle
Nur zum Spaß:
quelle
Ich denke wir können es mögen
Ich benutze parseFloat zweimal, denn wenn 1) Sie (a) 9 + b ("1") hinzufügen, ist das Ergebnis "91", aber wir möchten eine Addition. Also habe ich parseFloat benutzt
2) Wenn (a) 9 + parseFloat ("1") hinzugefügt wird, obwohl das Ergebnis "10" ist, aber es wird in einer Zeichenfolge sein, die wir nicht wollen, also habe ich parseFloat verwendet.
Ich hoffe ich bin klar. Vorschläge sind willkommen
quelle
Hier ist meine Anfängermethode, um einfach den Durchschnitt zu finden. Hoffe das hilft jemandem.
quelle
Hier ist dein einziger Liner:
quelle
Ich denke, dies kann eine direkte Lösung sein, um den Durchschnitt mit einer for-Schleife und einer Funktion zu berechnen.
quelle
Es scheint unendlich viele Lösungen dafür zu geben, aber ich fand das prägnant und elegant.
Oder genauer:
Abhängig von Ihrem Browser müssen Sie möglicherweise explizite Funktionsaufrufe ausführen, da Pfeilfunktionen nicht unterstützt werden:
Oder:
quelle
Wenn Sie den Durchschnitt benötigen und die Berechnung der Summe überspringen können, können Sie den Durchschnitt mit einem einzigen Aufruf zum Reduzieren berechnen:
quelle
Wenn jemand es jemals braucht - Hier ist ein rekursiver Durchschnitt.
Im Kontext der ursprünglichen Frage möchten Sie möglicherweise den rekursiven Durchschnitt verwenden, wenn Sie dem Benutzer das Einfügen zusätzlicher Werte gestattet haben und den vorhandenen Durchschnitt "aktualisieren" möchten, ohne die Kosten für den erneuten Besuch jedes Elements zu verursachen.
Wie:
Dies funktioniert, indem der aktuelle Durchschnitt und die Anzahl der Elemente beibehalten werden. Wenn ein neuer Wert aufgenommen werden soll, erhöhen Sie die Anzahl um 1, skalieren den vorhandenen Durchschnitt um
(count-1) / count
und addierennewValue / count
zum Durchschnitt.Leistungen:
Nachteile:
BigNumber
quelle
Durchschnitt der HTML-Inhalte
Mit jQuery oder Javascript haben
querySelector
Sie direkten Zugriff auf formatierte Daten ... Beispiel:Mit jQuery haben Sie also
Weitere weitere 4 Möglichkeiten (!), Auf itens zuzugreifen und es zu mitteln: http://jsfiddle.net/4fLWB/
quelle
var arr = [1,2,3,4,5]
Durchschnitt (arr) ====== >>>> 3
Dies funktioniert mit Zeichenfolgen als Zahlen oder Zahlen im Array.
quelle
quelle
Ich würde D3 in diesem Fall empfehlen. Es ist am besten lesbar (und bietet 2 verschiedene Arten von Durchschnittswerten)
quelle