Question Comment trouver la somme d'un tableau de nombres


Étant donné un tableau [1, 2, 3, 4], comment puis-je trouver la somme de ses éléments? (Dans ce cas, la somme serait 10.)

j'ai pensé $.each pourrait être utile, mais je ne suis pas sûr de savoir comment l'appliquer.


411
2017-08-04 22:29


origine


Réponses:


Recommandé (réduire avec la valeur par défaut)

Array.prototype.reduce peut être utilisé pour itérer dans le tableau, en ajoutant la valeur de l'élément en cours à la somme des valeurs de l'élément précédent.

console.log(
  [1, 2, 3, 4].reduce((a, b) => a + b, 0)
)
console.log(
  [].reduce((a, b) => a + b, 0)
)

Sans valeur par défaut

Vous obtenez un TypeError

console.log(
  [].reduce((a, b) => a + b)
)

Avant les fonctions de flèche d'ES6

console.log(
  [1,2,3].reduce(function(acc, val) { return acc + val; }, 0)
)

console.log(
  [].reduce(function(acc, val) { return acc + val; }, 0)
)

Entrées sans numéro

Si les non-numéros sont des entrées possibles, vous voudrez peut-être gérer cela?

console.log(
  ["hi", 1, 2, "frog"].reduce((a, b) => a + b)
)

let numOr0 = n => isNaN(n) ? 0 : n

console.log(
  ["hi", 1, 2, "frog"].reduce((a, b) => 
    numOr0(a) + numOr0(b))
)

Non recommandé dangereux utilisation d'eval

On peut utiliser eval pour exécuter une représentation sous forme de chaîne du code JavaScript. En utilisant la fonction Array.prototype.join pour convertir le tableau en une chaîne, nous changeons [1,2,3] en "1 + 2 + 3", ce qui donne 6.

console.log(
  eval([1,2,3].join('+'))
)

//This way is dangerous if the array is built
// from user input as it may be exploited eg: 

eval([1,"2;alert('Malicious code!')"].join('+'))

Bien sûr, afficher une alerte n'est pas la pire chose qui puisse arriver. La seule raison pour laquelle j'ai inclus ceci est en réponse à la question d'Ortund car je ne pense pas qu'elle ait été clarifiée.


80
2018-04-12 07:31



Dans Zézayer, ce serait exactement le travail pour reduce. Vous verriez ce genre de code:

(reduce #'+ '(1 2 3)) ; 6

Heureusement, en JavaScript, nous avons aussi reduce! Malheureusement, + est un opérateur, pas une fonction. Mais nous pouvons le rendre joli! Ici, regardez:

var sum = [1, 2, 3].reduce(add, 0);

function add(a, b) {
    return a + b;
}

console.log(sum); // 6

N'est-ce pas joli? :-)

Encore mieux! Si vous utilisez ECMAScript 2015 (alias ECMAScript 6), ça peut être joli:

var sum = [1, 2, 3].reduce((a, b) => a + b, 0);
console.log(sum); // 6

896
2018-05-25 16:30



Pourquoi ne pas réduire? C'est généralement un peu contre-intuitif, mais l'utiliser pour trouver une somme est assez simple:

var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);

166
2018-01-16 09:45



var arr = [1,2,3,4];
var total=0;
for(var i in arr) { total += arr[i]; }

76
2017-08-04 22:31



var total = 0;
$.each(arr,function() {
    total += this;
});

61
2017-08-04 22:30



Cela est possible en passant en boucle sur tous les éléments et en les ajoutant à chaque itération à un sum-variable.

var array = [1, 2, 3];

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

JavaScript ne connaît pas la portée du bloc, donc sum sera accesible:

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

Le même que ci-dessus, cependant annoté et préparé comme une fonction simple:

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;
}

24
2018-05-25 16:03



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

Référence: Array.prototype.reduce ()


22
2017-12-13 07:49