[1, 2, 3, 4]
Wie kann ich bei einem Array die Summe seiner Elemente finden? (In diesem Fall wäre die Summe 10
.)
Ich dachte, es $.each
könnte nützlich sein, bin mir aber nicht sicher, wie ich es implementieren soll.
javascript
jquery
arrays
akano1
quelle
quelle
a[0] + a[1] + ...
, was zu einer Verkettung von Zeichenfolgen führen kann, wenn das Array nicht nummerierte Elemente enthält. ZB['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
.[1,2,3].reduce(Math.sum)
.Antworten:
Empfohlen (mit Standardwert reduzieren)
Array.prototype.reduce kann verwendet werden, um das Array zu durchlaufen und den aktuellen Elementwert zur Summe der vorherigen Elementwerte hinzuzufügen.
Ohne Standardwert
Sie erhalten einen TypeError
Vor den Pfeilfunktionen von ES6
Nicht nummerierte Eingänge
Wenn Nicht-Zahlen mögliche Eingaben sind, möchten Sie vielleicht damit umgehen?
Nicht empfohlene gefährliche Bewertung
Wir können eval verwenden , um eine Zeichenfolgendarstellung von JavaScript-Code auszuführen. Mit der Funktion Array.prototype.join zum Konvertieren des Arrays in einen String ändern wir [1,2,3] in "1 + 2 + 3", was 6 ergibt.
Das Anzeigen einer Warnung ist natürlich nicht das Schlimmste, was passieren kann. Der einzige Grund, warum ich dies aufgenommen habe, ist die Beantwortung von Ortunds Frage, da ich nicht glaube, dass sie geklärt wurde.
quelle
reduce()
immer noch 25-30% langsamer ist als eine einfache indiziertefor()
Schleife? jsperf.com/reduce-vs-loop/4In Lisp wäre dies genau der richtige Job
reduce
. Sie würden diese Art von Code sehen:Zum Glück haben wir in JavaScript auch
reduce
! Leider+
ist ein Operator keine Funktion. Aber wir können es hübsch machen! Hier, schau:Ist das nicht hübsch? :-)
Noch besser! Wenn Sie ECMAScript 2015 (auch bekannt als ECMAScript 6 ) verwenden, kann dies so hübsch sein:
quelle
[1, 2, 3].reduce((a,b)=>a+b)
Array.prototype.sum = function() { return this.reduce((a,b) => a+b, 0); }
Array.prototype.avg = function() { return this.reduce((a,b) => a+b, 0)/this.length; }
Warum nicht reduzieren? Es ist normalerweise etwas kontraintuitiv, aber es ist ziemlich einfach, es zu verwenden, um eine Summe zu finden:
quelle
reduce()
?Array.prototype.reduce()
reduziert ein Array auf einen einzelnen Rückgabewert.quelle
(var i=0; i<arr.length; i++)
ist jedoch noch schneller. Und selbst dann ist die Verwendungvar sum=0; var i=arr.length; while(i--) sum += arr[i]
noch schneller.for... in
Schleifen für Arrays funktioniert in diesem Fall zufällig und weil Arrays Objekte erweitern. Rikings Lösung ist besserfor...in
Schleife in JavaScript nimmt die Indizes auf, was ein häufiger Stolperstein für Codierer ist, die erwarten, die Werte zu erhalten. (Versuchen Sie esfor(var i in [1,2,3]) { console.log(i); }
in einer Konsole.)quelle
reduce
unten; Deklarieren Sie keine veränderlichen Variablen, wenn Sie keine haben.Wenn Sie zufällig Lodash verwenden, können Sie die Summenfunktion verwenden
quelle
Dies ist möglich, indem alle Elemente
sum
durchlaufen und bei jeder Iteration zu einer Variablen hinzugefügt werden.JavaScript kennt das Block-Scoping nicht und ist daher
sum
zugänglich:Das gleiche wie oben, jedoch als einfache Funktion kommentiert und vorbereitet:
quelle
sum
außerhalb der Schleife deklariert , viel besser lesbar finden.const
undlet
. Sie können alsosum
außerhalb derfor
Schleife als deklarierenlet sum = 0;
. Sie können die Array-Länge auch vor der Schleife alsconst length = array.length;
Referenz: Array.prototype.reduce ()
quelle
arr
ist[]
.arr.reduce(function (a, b) { return a + b; }, 0);
Dies dauert durchschnittlich 1,57 ms / Lauf (gemessen über 1000 Läufe auf einem Array von 100 zufälligen Normalzahlen), verglichen mit 3,604 ms / Lauf mit der
eval()
obigen Methode und 2,151 ms / Lauf mit einem Standard für (i, Länge, ++) ) Schleife.Hinweis zur Methodik: Dieser Test wurde auf einem Google Apps Script-Server ausgeführt, sodass die Javascript-Engines weitgehend mit denen von Chrome identisch sind.
BEARBEITEN:
--i
anstatti--
0,12 ms pro Lauf zu speichern (i-- ist 1,7)EDIT: Holy Expletive, egal diesen ganzen Beitrag. Verwenden Sie die oben erwähnte Methode redu (), sie beträgt nur 1 ms / Lauf.
quelle
while (--i) do_something
könnte auch für andere Dinge funktionieren.var sum = arr[0]
Sie können auch reduRight verwenden.
was ergibt Ausgabe als 21.
Referenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
quelle
Wer sucht einen funktionierenden Oneliner wie mich? Nimm das:
quelle
arr.reduce(function(a, b) { return a + b;}, 0);
Lustiger Ansatz:
quelle
reduce
ist in den meisten, wenn nicht allen Fällen definitiv vorzuziehen.[1,"2;YourProgram.ripToShreds();3",4]
NaN
beim Versuch eineeval(['alert("removing your computer")',2,3].join("+"))
falsche Antwort 0/10OK, stellen Sie sich vor, Sie haben dieses Array unten:
Lassen Sie uns viele verschiedene Möglichkeiten untersuchen , da ich hier keine umfassende Antwort finden konnte:
1) Verwenden der integrierten Reduktion ()
2) Verwenden der for-Schleife
3) Verwenden der while-Schleife
4) Verwenden des Arrays forEach
und nenne es so:
Es wird nicht empfohlen, einen solchen Prototyp für Array zu erstellen ...
quelle
Eine Standard-JavaScript-Lösung:
Das funktioniert bei mir (das Ergebnis sollte 5 sein). Ich hoffe, dass diese Art von Lösung keinen versteckten Nachteil hat.
quelle
Auf diese Weise können Sie alle Arten von exotischen Dingen in das Array aufnehmen.
Ich scherze nur halb.
quelle
eval(['alert("removing your computer")',2,3].join("+"))
Ich bin ein Anfänger mit JavaScript und Codierung im Allgemeinen, aber ich fand, dass eine einfache und einfache Möglichkeit, die Zahlen in einem Array zu summieren, folgendermaßen ist:
Grundsätzlich wollte ich dazu beitragen, weil ich nicht viele Lösungen gesehen habe, die keine integrierten Funktionen verwenden, und diese Methode ist einfach zu schreiben und zu verstehen.
quelle
Ein kurzes Stück JavaScript-Code würde diesen Job erledigen:
quelle
Einige Leute haben vorgeschlagen, eine
.sum()
Methode zum hinzuzufügenArray.prototype
. Dies wird im Allgemeinen als schlechte Praxis angesehen, daher schlage ich nicht vor, dass Sie es tun.Wenn Sie immer noch darauf bestehen, ist dies eine prägnante Schreibweise:
dann:
[1,2].sum(); // 3
Beachten Sie, dass die dem Prototyp hinzugefügte Funktion eine Mischung aus ES5- und ES6-Funktion und Pfeilsyntax verwendet. Das
function
wird deklariert, damit die Methode denthis
Kontext von demArray
abrufen kann, mit dem Sie arbeiten. Ich habe das der=>
Kürze halber innerhalb desreduce
Anrufs verwendet.quelle
Verwenden Sie eine
for
Schleife:Oder sogar eine
forEach
Schleife:Verwenden Sie zur Vereinfachung
reduce
:quelle
Keine Notwendigkeit
initial value
! Denn wenn no übergebeninitial value
wird, wird dascallback function
nicht für das erste Element der Liste aufgerufen, und das erste Element wird stattdessen als übergebeninitial value
. Sehr gute Funktion :)quelle
Hier ist eine elegante Einzeilerlösung, die einen Stapelalgorithmus verwendet . Es kann jedoch einige Zeit dauern, bis Sie die Schönheit dieser Implementierung verstanden haben.
Grundsätzlich akzeptiert die Funktion ein Array und prüft, ob das Array genau ein Element enthält. Wenn false, wird das letzte Element aus dem Stapel entfernt und das aktualisierte Array zurückgegeben.
Das Schöne an diesem Snippet ist, dass die Funktion die
arr[0]
Überprüfung umfasst , um Endlosschleifen zu verhindern. Sobald das letzte Element erreicht ist, wird die gesamte Summe zurückgegeben.quelle
Sie können die Methode redu () mit dem Lambda-Ausdruck kombinieren:
quelle
Verwenden
reduce
quelle
Ich sah alle Antworten für "reduzieren" Lösung gehen
quelle
Richtigkeit
Sortieren Sie das Array und die Startsumme aus den kleinsten Zahlen (Snippet zeigt Unterschied zu Nicht-Sortierung)
Code-Snippet anzeigen
Für mehrdimensionale Zahlenreihen verwenden
arr.flat(Infinity)
Code-Snippet anzeigen
quelle
Coole Tricks hier, ich habe eine gute Wahl mit vielen der sicheren traditionellen Antworten, die nicht die Länge des Arrays zwischenspeichern.
Ohne die Länge des Arrays zwischenzuspeichern, muss der JS-Compiler das Array bei jeder Iteration der Schleife durchlaufen, um die Länge zu berechnen. In den meisten Fällen ist dies kein unnötiger Overhead. V8 und viele moderne Browser optimieren dies für uns, daher ist dies weniger ein Problem als früher, aber es gibt ältere Geräte, die von diesem einfachen Caching profitieren.
Wenn sich die Länge ändern kann, kann das Zwischenspeichern zu unerwarteten Nebenwirkungen führen, wenn Sie nicht wissen, warum Sie die Länge zwischenspeichern. Bei einer wiederverwendbaren Funktion besteht der einzige Zweck darin, ein Array zu verwenden und die Werte zu addieren tolle Passform.
Hier ist ein CodePen-Link für diese arraySum-Funktion. http://codepen.io/brandonbrule/pen/ZGEJyV
Es ist möglich, dass dies eine veraltete Denkweise ist, die mir am Herzen liegt, aber ich sehe keinen Nachteil darin, sie in diesem Zusammenhang zu verwenden.
quelle
Das sind wirklich gute Antworten, aber nur für den Fall, dass die Zahlen wie in der Frage (1,2,3,4) aufeinander folgen, können Sie dies leicht tun, indem Sie die Formel (n * (n + 1)) / 2 anwenden, wobei n ist die letzte Zahl
quelle
quelle
Das ist viel einfacher
quelle
Ein einfaches Methodenbeispiel:
quelle