J'ai des problèmes pour ajouter tous les éléments d'un tableau et pour les calculer en moyenne. Comment pourrais-je faire cela et l'implémenter avec le code que j'ai actuellement? Les éléments sont censés être définis comme je l'ai ci-dessous.
<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
la source
la source
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
serait tellement plus agréable.Réponses:
Effectuez simplement une itération dans le tableau, puisque vos valeurs sont des chaînes, elles doivent d'abord être converties en entier. Et la moyenne n'est que la somme des valeurs divisée par le nombre de valeurs.
la source
for(var i = 0; i < elmt.length; i++;)
parfor(var i = 0, l = elmt.length; i < l; i++)
sum += parseInt(elmt[i], 10);
supposant que elmt [i] est du lien deUne solution que je considère plus élégante:
la source
sum/times.length
étape):var avg = times.reduce(function(p,c,i){return p+(c-p)/(i+1)},0);
times.reduce((a,b) => (a+b)) / times.length;
ES6
la source
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
.Calcul de la moyenne (moyenne) à l'aide de réduire et ES6:
la source
généralement moyen en utilisant une seule ligne réduire est comme ça
spécifiquement à la question posée
une version efficace est comme
Comprendre Javascript Array Réduire en 1 minute http://www.airpair.com/javascript/javascript-array-reduce
comme gotofritz l'a souligné, Array.reduce ignore les valeurs non définies. alors voici une solution:
la source
elements.length!=0?elements.length:1
peut également être écrit comme ceci:elements.length || 1
qui est plus court et plus facile à lire.Imaginons que nous ayons un tableau d'entiers comme celui-ci:
La moyenne est obtenue avec la formule suivante
A = (1 / n) Σxi (avec i = 1 à n) ... Donc: x1 / n + x2 / n + ... + xn / n
Nous divisons la valeur actuelle par le nombre de valeurs et ajoutons le résultat précédent à la valeur renvoyée.
La signature de la méthode de réduction est
La fonction de rappel de réduction prend les paramètres suivants:
Le deuxième paramètre de réduction est la valeur par défaut ... (Utilisé si le tableau est vide ).
Ainsi, la méthode de réduction moyenne sera:
Si vous préférez, vous pouvez créer une fonction distincte
Et puis référez-vous simplement à la signature de la méthode de rappel
Ou Augmentez directement le prototype Array.
Il est possible de diviser la valeur chaque fois que la méthode de réduction est appelée.
Ou encore mieux , en utilisant le Array.protoype.sum () précédemment défini
méthode, optimisez le processus en n'appelant la division qu'une seule fois :)
Puis sur n'importe quel objet Array de la portée:
NB: un tableau vide avec retour a NaN wish est plus correct que 0 à mon avis et peut être utile dans des cas d'utilisation spécifiques.
la source
Vous pouvez également utiliser lodash , _.sum (tableau) et _.mean (tableau) dans la partie Math (également avoir d'autres choses pratiques).
la source
Pas le plus rapide, mais le plus court et en une seule ligne utilise map () & reduction ():
la source
[7,14,21].reduce((avg,e,i,arr)=>avg+e/arr.length,0);
mais avec un comportement différent sur un tableau vide. Si vous voulez que le résultat soit vide sur un tableau vide:[].reduce((a,e,i,arr)=>(a?a:0)+e/arr.length,"")
for (var avg = 0, length = i = arr.length; i--;) avg += arr[i] / length
Beaucoup plus clair, plus court et beaucoup plus rapideUne façon sournoise de le faire bien qu'elle nécessite l'utilisation de (le plus détesté) eval ().
Je pensais juste que je publierais cela comme l'une de ces options «hors des sentiers battus». Vous ne savez jamais, la ruse pourrait vous accorder (ou vous enlever) un point.
la source
eval()
problème possible que je peux voir est que vous devez vous assurer que le tableau ne contient que des nombres (ce qui est bien sûr également vrai pour toutes les autres réponses ici). Les entrées non numériques se bloquent avec unReferenceError
ouSyntaxError, except nested arrays of numbers which introduce
, `provoquant un total numérique incorrect. Et bien sûr, dans JS côté serveur, par exemple node.js, celaeval()
pourrait naturellement introduire des problèmes de sécurité. Mais cela semble parfait pour toutes les utilisations côté client bien structurées.eval()
comme ça - voir la section sur les performances de nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstoodJ'utilise ces méthodes dans ma bibliothèque personnelle:
EDIT: Pour les utiliser, demandez simplement au tableau sa somme ou sa moyenne, comme:
la source
Dans les navigateurs compatibles ES6, ce polyfill peut être utile.
Vous pouvez partager la même méthode d'appel entre
Math.sum
,Math.avg
etMath.max
, commevous pouvez utiliser Math.sum comme
ou si vous avez un tableau à résumer, vous pouvez utiliser
juste comme
la source
Array.prototype
, je pense que l'ajout d'un thème à unMath
objet est un meilleur choix - ce sont tous des "gestionnaires de nombres".Voici un ajout rapide à l'objet «Math» en javascript pour y ajouter une commande «moyenne» !!
Ensuite, j'ai cet ajout à l'objet "Math" pour obtenir la somme!
Alors tout ce que tu fais c'est
Et où je mets le tableau d'espace réservé, passez simplement votre variable (L'entrée s'il s'agit de nombres peut être une chaîne à cause de son analyse en un nombre!)
la source
réglez votre compteur de boucle for à 0 ... vous obtenez l'élément 9 et vous avez terminé comme vous l'avez maintenant. Les autres réponses sont des mathématiques de base. Utilisez une variable pour stocker votre somme (besoin de convertir les chaînes en entiers) et divisez par la longueur de votre tableau.
la source
Commencez par définir toutes les variables que nous prévoyons d'utiliser. Vous noterez que pour le
numbers
tableau, j'utilise la notation littérale de[]
par opposition à la méthode du constructeurarray()
. De plus, j'utilise une méthode plus courte pour définir plusieurs variables sur 0.Ensuite, je remplis mon tableau de nombres vides avec les valeurs 0 à 11. C'est pour m'amener à votre point de départ d'origine. Notez comment je pousse sur le tableau
count++
. Cela pousse la valeur actuelle de count, puis l'incrémente pour la prochaine fois.Enfin, j'exécute une fonction "pour chacun" des nombres dans le tableau des nombres. Cette fonction gérera un nombre à la fois, que j'identifie comme "n" dans le corps de la fonction.
En fin de compte, nous pouvons afficher à la fois la
sum
valeur et laavg
valeur sur notre console afin de voir le résultat:Voyez-le en action en ligne à http://jsbin.com/unukoj/3/edit
la source
Je ne fais que construire sur la réponse d'Abdennour TOUMI. voici les raisons pour lesquelles:
1.) Je suis d'accord avec Brad, je ne pense pas que ce soit une bonne idée d'étendre un objet que nous n'avons pas créé.
2.)
array.length
est exactement fiable en javascript, je préfèreArray.reduce
beacusea=[1,3];a[1000]=5;
, maintenanta.length
reviendrait1001
.la source
Ensuite :
la source
Sur les navigateurs Evergreen, vous pouvez utiliser les fonctions fléchées
avg = [1,2,3].reduce((a,b) => (a+b);
En l'exécutant 100 000 fois, le décalage horaire entre l'approche de la boucle for et la réduction est négligeable.
la source
console.time
&console.timeEnd
Une doublure moyenne la plus courte:
Somme la plus courte d'une doublure:
la source
Juste pour l'adrénaline:
la source
Je pense que nous pouvons faire comme
J'utilise parseFloat deux fois parce que lorsque 1) vous ajoutez (a) 9 + b ("1") nombre, le résultat sera "91" mais nous voulons une addition. donc j'ai utilisé parseFloat
2) Lorsque l'ajout de (a) 9 + parseFloat ("1") se produit bien que le résultat soit "10" mais ce sera dans une chaîne que nous ne voulons pas alors j'ai utilisé parseFloat.
J'espère que je suis clair. Les suggestions sont les bienvenues
la source
Voici ma façon novice de trouver simplement la moyenne. J'espère que cela aide quelqu'un.
la source
voici votre seule doublure:
la source
Je pense que cela peut être une solution directe pour calculer la moyenne avec une boucle et une fonction for.
la source
Il semble y avoir un nombre infini de solutions pour cela, mais j'ai trouvé cela concis et élégant.
Ou plus simplement:
En fonction de votre navigateur, vous devrez peut-être effectuer des appels de fonction explicites car les fonctions fléchées ne sont pas prises en charge:
Ou:
la source
Si vous avez besoin de la moyenne et pouvez ignorer l'exigence de calcul de la somme, vous pouvez calculer la moyenne avec un seul appel de réduire:
la source
Si quelqu'un en a besoin - Voici une moyenne récursive.
Dans le contexte de la question d'origine, vous souhaiterez peut-être utiliser la moyenne récursive si vous avez autorisé l'utilisateur à insérer des valeurs supplémentaires et, sans encourir le coût de la visite à nouveau de chaque élément, souhaitez «mettre à jour» la moyenne existante.
Comment:
cela fonctionne en conservant la moyenne actuelle et le nombre d'éléments. Lorsqu'une nouvelle valeur doit être incluse, vous incrémentez le nombre de 1, mettez à l'échelle la moyenne existante de
(count-1) / count
et ajouteznewValue / count
à la moyenne.Avantages:
Inconvénients:
BigNumber
la source
Moyenne du contenu HTML itens
Avec jQuery ou Javascript,
querySelector
vous avez un accès direct aux données formatées ... Exemple:Donc, avec jQuery vous avez
Voir d'autres méthodes 4 (!) Pour y accéder et faire la moyenne: http://jsfiddle.net/4fLWB/
la source
var arr = [1,2,3,4,5]
avg (arr) ====== >>>> 3
Cela fonctionne avec des chaînes sous forme de nombres ou de nombres dans le tableau.
la source
la source
Je recommanderais D3 dans ce cas. C'est le plus lisible (et fournit 2 types de moyennes différents)
la source