1533 Stimmen

So finden Sie die Summe einer Reihe von Zahlen

Angesichts eines Arrays [1, 2, 3, 4] Wie kann ich die Summe seiner Elemente finden? (In diesem Fall würde die Summe lauten 10 .)

Ich dachte $.each könnte nützlich sein, aber ich bin mir nicht sicher, wie man es implementiert.

37 Stimmen

@tereško Unlust zu googeln ist kein gültiger Abschlussgrund auf Stackoverflow. Bitte stimmen Sie ab, wenn Sie das Gefühl haben, dass die Frage nicht gut (re)gesucht ist. (Auch nach den Antworten zu urteilen, scheint dies ein sehr kontroverses Thema mit vielen möglichen Lösungen zu sein, einschließlich einiger sehr hoch bewerteter schlechter Praktiken (eval) - überraschenderweise).

13 Stimmen

Hinweis: Die meisten Antworten hier berechnen im Wesentlichen a[0] + a[1] + ... was sich in eine String-Verkettung verwandeln kann, wenn das Array Nicht-Zahlen-Elemente enthält. z.B. ['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42" .

4 Stimmen

Kein eingebauter Reducer, den man in Array.reduce einspeisen könnte? Ich dachte an etwas wie [1,2,3].reduce(Math.sum) .

59voto

geek-merlin Punkte 1192

Ist jemand wie ich auf der Suche nach einem funktionalen Oneliner?

Angenommen:

const arr = [1, 2, 3, 4];

Hier ist der Oneliner für modernes JS:

sum = arr.reduce((a, b) => a + b, 0);

(Falls Sie zufällig den alten IE ohne Pfeilfunktionen unterstützen müssen:)

sum = arr.reduce(function (a, b) {return a + b;}, 0);

Beachten Sie, dass 0 ist hier der Ausgangswert, den Sie bei Bedarf als Offset verwenden können. Beachten Sie auch, dass dieser Anfangswert benötigt wird, da sonst der Aufruf der Funktion mit einem leeren Array zu einem Fehler führt.

53voto

Wenn Sie Lodash verwenden, können Sie die Summe Funktion

array = [1, 2, 3, 4];
sum = _.sum(array); // sum == 10

0 Stimmen

Funktioniert auch gut mit Typescript.

0 Stimmen

Was ist mit diesen Antworten? Er hat Lodash nicht markiert, und es gibt viele bessere Antworten oben. Darüber hinaus ist dies eine Art von sagen "Wenn Sie zufällig Python verwenden, können Sie dies tun".

0 Stimmen

Und wenn Sie nicht zufällig Lodash verwenden, können Sie es npm.. keine Offenheit für die Dramaqueen @Blaze612YT

37voto

yckart Punkte 29968

Dies ist möglich, indem man alle Elemente in einer Schleife durchläuft und sie bei jeder Iteration zu einem sum -Variable.

var array = [1, 2, 3];

for (var i = 0, sum = 0; i < array.length; sum += array[i++]);

JavaScript kennt kein Block-Scoping, also sum zugänglich sein wird:

console.log(sum); // => 6

Das Gleiche wie oben, jedoch mit Anmerkungen versehen und als einfache Funktion aufbereitet:

function sumArray(array) {
  for (
    var
      index = 0,              // The iterator
      length = array.length,  // Cache the array length
      sum = 0;                // The total amount
      index < length;         // The "for"-loop condition
      sum += array[index++]   // Add number on each iteration
  );
  return sum;
}

14 Stimmen

Auch wenn es clever ist, würde ich Code finden, der sum außerhalb der Schleife viel besser lesbar.

1 Stimmen

@BeniCherniavsky-Paskin Ja, ich auch... Ich weiß nicht, warum ich es an diesem Tag so gemacht habe... Wie auch immer, ich lasse es so wie es ist! Es ist nur ein Beispiel für wie wir es könnten... ;)

0 Stimmen

Seit ES6, Javascript kennt Block Scoping mit const y let . Sie können also erklären sum außerhalb der for Schleife als let sum = 0; . Sie können die Array-Länge auch vor der Schleife zwischenspeichern als const length = array.length;

28voto

onhout Punkte 269
arr.reduce(function (a, b) {
    return a + b;
});

Referenz: _Array.prototype.reduce()_

8 Stimmen

Dies wird fehlschlagen, wenn arr es [] .

12 Stimmen

Fügen Sie einen Standardwert hinzu, etwa so: arr.reduce(function (a, b) { return a + b; }, 0);

21voto

Alireza Punkte 92209

OK, stellen Sie sich vor, Sie haben dieses Feld unten:

const arr = [1, 2, 3, 4];

Beginnen wir mit der Untersuchung von viele verschiedene Möglichkeiten zu tun, da ich hier keine umfassende Antwort finden konnte:

1) Verwendung der eingebauten Funktion reduce()

function total(arr) {
  if(!Array.isArray(arr)) return;
  return arr.reduce((a, v)=>a + v);
}

2) Verwendung der for-Schleife

function total(arr) {
  if(!Array.isArray(arr)) return;
  let totalNumber = 0;
  for (let i=0,l=arr.length; i<l; i++) {
     totalNumber+=arr[i];
  }
  return totalNumber;
}

3) Verwendung der while-Schleife

function total(arr) {
  if(!Array.isArray(arr)) return;
  let totalNumber = 0, i=-1;
  while (++i < arr.length) {
     totalNumber+=arr[i];
  }
  return totalNumber;
}

4) Array forEach verwenden

function total(arr) {
  if(!Array.isArray(arr)) return;
  let sum=0;
  arr.forEach(each => {
    sum+=each;
  });
  return sum;
};

und nennen Sie es so:

total(arr); //return 10

Es ist nicht empfehlenswert, so etwas als Prototyp für Array zu verwenden...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X