É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é que cela $.each
pourrait être utile, mais je ne sais pas comment le mettre en œuvre.
javascript
jquery
arrays
akano1
la source
la source
a[0] + a[1] + ...
, ce qui peut se transformer en concaténation de chaînes si le tableau a des éléments non numériques. Par exemple['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
.[1,2,3].reduce(Math.sum)
.Réponses:
Recommandé (réduire avec la valeur par défaut)
Array.prototype.reduce peut être utilisé pour parcourir le tableau, en ajoutant la valeur d'élément actuelle à la somme des valeurs d'élément précédentes.
Sans valeur par défaut
Vous obtenez une TypeError
Avant les fonctions fléchées d'ES6
Entrées non numériques
Si des non-nombres sont des entrées possibles, vous voudrez peut-être gérer cela?
Utilisation dangereuse de l' évaluateur non recommandée
Nous pouvons utiliser eval pour exécuter une représentation sous forme de chaîne de code JavaScript. En utilisant la fonction Array.prototype.join pour convertir le tableau en chaîne, nous changeons [1,2,3] en "1 + 2 + 3", ce qui donne 6.
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 comme une réponse à la question d'Ortund car je ne pense pas qu'elle ait été clarifiée.
la source
reduce()
est toujours 25-30% plus lente qu'une simplefor()
boucle indexée après de longues années? jsperf.com/reduce-vs-loop/4À Lisp , ce serait exactement le travail pour
reduce
. Vous verriez ce type de code:Heureusement, en JavaScript, nous en avons aussi
reduce
! Malheureusement,+
c'est un opérateur, pas une fonction. Mais nous pouvons le rendre joli! Ici, regardez:N'est-ce pas joli? :-)
Encore mieux! Si vous utilisez ECMAScript 2015 (alias ECMAScript 6 ), cela peut être assez joli:
la source
[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; }
Pourquoi ne pas réduire? C'est généralement un peu contre-intuitif, mais l'utiliser pour trouver une somme est assez simple:
la source
reduce()
?Array.prototype.reduce()
réduit un tableau à une seule valeur de retour.la source
(var i=0; i<arr.length; i++)
est encore plus rapide. Et même alors, l'utilisationvar sum=0; var i=arr.length; while(i--) sum += arr[i]
est encore plus rapide.for... in
boucles sur les tableaux fonctionne dans ce cas _ par coïncidence_ et parce que les tableaux étendent les objets. La solution de Riking est meilleurefor...in
boucle en JavaScript prend les indices, ce qui est une pierre d'achoppement courante pour les codeurs qui s'attendent à obtenir les valeurs. (Essayezfor(var i in [1,2,3]) { console.log(i); }
dans une console.)la source
reduce
ci-dessous; ne déclarez pas de variables mutables lorsque vous n'en avez pas trop.Si vous utilisez Lodash, vous pouvez utiliser la fonction somme
la source
Cela est possible en bouclant sur tous les éléments et en les ajoutant à chaque itération à une
sum
variable.JavaScript ne connaît pas la portée des blocs, il
sum
sera donc accessible:Le même que ci-dessus, cependant annoté et préparé comme une fonction simple:
la source
sum
dehors de la boucle beaucoup plus lisible.const
etlet
. Vous pouvez donc déclarer ensum
dehors de lafor
boucle commelet sum = 0;
. Vous pouvez également mettre en cache la longueur du tableau avant la boucle commeconst length = array.length;
Référence: Array.prototype.reduce ()
la source
arr
c'est le cas[]
.arr.reduce(function (a, b) { return a + b; }, 0);
Cela prendra en moyenne 1,57 ms / run (mesuré sur 1000 runs sur un tableau de 100 nombres normaux aléatoires), contre 3,604 ms / run avec la
eval()
méthode ci-dessus et 2,151 ms / run avec un standard pour (i, length, ++ ) boucle.Remarque sur la méthodologie: ce test a été exécuté sur un serveur de script Google Apps, de sorte que leurs moteurs javascript sont à peu près les mêmes que Chrome.
EDIT:
--i
au lieu d'i--
enregistrer 0,12 ms à chaque exécution (i-- est 1,7)EDIT: Holy expletive, peu importe tout ce post. Utilisez la méthode Reduce () mentionnée ci-dessus, c'est seulement 1 ms / run.
la source
while (--i) do_something
pourrait aussi fonctionner pour d'autres choses.var sum = arr[0]
Vous pouvez également utiliser ReduceRight.
ce qui donne une sortie de 21.
Référence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
la source
Quelqu'un à la recherche d'un oneliner fonctionnel comme moi? Prends ça:
la source
arr.reduce(function(a, b) { return a + b;}, 0);
OK, imaginez que vous avez ce tableau ci-dessous:
Commençons à chercher de nombreuses façons de le faire car je n'ai trouvé aucune réponse complète ici:
1) Utilisation de la réduction intégrée ()
2) Utilisation de la boucle for
3) Utilisation de la boucle while
4) Utilisation de array forEach
et appelez-le comme ceci:
Il n'est pas recommandé de prototyper quelque chose comme ça à Array ...
la source
Approche amusante:
la source
reduce
est certainement préférable pour la majorité, sinon la totalité, des cas.[1,"2;YourProgram.ripToShreds();3",4]
NaN
essayant uneeval(['alert("removing your computer")',2,3].join("+"))
mauvaise réponse 0/10Une solution JavaScript standard:
Cela fonctionne pour moi (le résultat devrait être 5). J'espère qu'il n'y a aucun inconvénient caché dans ce type de solution.
la source
De cette façon, vous pouvez mettre toutes sortes de choses exotiques dans le tableau.
Je ne plaisante qu'à moitié.
la source
eval(['alert("removing your computer")',2,3].join("+"))
Je suis un débutant avec JavaScript et le codage en général, mais j'ai trouvé qu'un moyen simple et facile de additionner les nombres dans un tableau est comme ceci:
Fondamentalement, je voulais y contribuer car je n'ai pas vu beaucoup de solutions qui n'utilisent pas de fonctions intégrées, et cette méthode est facile à écrire et à comprendre.
la source
Un court morceau de code JavaScript ferait ce travail:
la source
Quelques personnes ont suggéré d'ajouter une
.sum()
méthode auArray.prototype
. Ceci est généralement considéré comme une mauvaise pratique, donc je ne suggère pas que vous le fassiez.Si vous insistez toujours pour le faire, voici une façon succincte de l'écrire:
puis:
[1,2].sum(); // 3
Notez que la fonction ajoutée au prototype utilise un mélange de fonctions ES5 et ES6 et de syntaxe de flèche. Le
function
est déclaré pour permettre à la méthode d'extraire lethis
contexte de celui surArray
lequel vous travaillez. J'ai utilisé=>
pour plus de concision dans l'reduce
appel.la source
Utilisez une
for
boucle:Ou même une
forEach
boucle:Pour plus de simplicité, utilisez
reduce
:la source
Pas besoin
initial value
! Parce que si noninitial value
est passé, lecallback function
n'est pas invoqué sur le premier élément de la liste, et le premier élément est plutôt passé en tant queinitial value
. Très c OO l fonctionnalité :)la source
Voici une élégante solution à une ligne qui utilise un algorithme de pile , bien que l'on puisse prendre un certain temps pour comprendre la beauté de cette implémentation.
Fondamentalement, la fonction accepte un tableau et vérifie si le tableau contient exactement un élément. S'il est faux, il fait sortir le dernier élément de la pile et renvoie le tableau mis à jour.
La beauté de cet extrait est que la fonction inclut une
arr[0]
vérification pour éviter une boucle infinie. Une fois qu'il a atteint le dernier élément, il retourne la somme entière.la source
Vous pouvez combiner la méthode Reduce () avec l'expression lambda:
la source
Utilisation
reduce
la source
j'ai vu toutes les réponses pour la solution «réduire»
la source
Précision
Tableau de tri et somme de début sous forme de plus petits nombres (l'extrait de code montre la différence avec le non tri)
Afficher l'extrait de code
Pour un tableau multidimensionnel de nombres, utilisez
arr.flat(Infinity)
Afficher l'extrait de code
la source
Trucs sympas ici, j'ai un choix avec beaucoup de réponses traditionnelles sûres ne mettant pas en cache la longueur du tableau.
Sans mettre en cache la longueur du tableau, le compilateur JS doit parcourir le tableau à chaque itération de la boucle pour calculer la longueur, c'est une surcharge inutile dans la plupart des cas. La V8 et de nombreux navigateurs modernes optimisent cela pour nous, c'est donc moins un problème que par le passé, mais il existe des appareils plus anciens qui bénéficient de cette mise en cache simple.
Si la longueur est sujette à changement, la mise en cache peut provoquer des effets secondaires inattendus si vous ne savez pas pourquoi vous mettez en cache la longueur, mais pour une fonction réutilisable, le seul but est de prendre un tableau et d'ajouter les valeurs ensemble, c'est un grand ajustement.
Voici un lien CodePen pour cette fonction arraySum. http://codepen.io/brandonbrule/pen/ZGEJyV
Il est possible que ce soit un état d'esprit dépassé qui m'est resté, mais je ne vois aucun inconvénient à l'utiliser dans ce contexte.
la source
Ce sont vraiment d'excellentes réponses, mais juste au cas où si les nombres sont dans l'ordre comme dans la question (1,2,3,4), vous pouvez facilement le faire en appliquant la formule (n * (n + 1)) / 2 où n est le dernier nombre
la source
la source
C'est beaucoup plus facile
la source
Un exemple de méthode simple:
la source