Tengo problemas para agregar todos los elementos de una matriz y promediarlos. ¿Cómo haría esto y lo implementaría con el código que tengo actualmente? Se supone que los elementos se definen como lo tengo a continuación.
<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
fuente
fuente
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Sería mucho más agradable.Respuestas:
Simplemente recorra la matriz, ya que sus valores son cadenas, primero deben convertirse a un entero. Y el promedio es solo la suma de valores dividida por el número de valores.
fuente
for(var i = 0; i < elmt.length; i++;)
confor(var i = 0, l = elmt.length; i < l; i++)
sum += parseInt(elmt[i], 10);
asumir que elmt [i] es de la base 10. enlaceUna solución que considero más elegante:
fuente
sum/times.length
paso):var avg = times.reduce(function(p,c,i){return p+(c-p)/(i+1)},0);
times.reduce((a,b) => (a+b)) / times.length;
ES6
fuente
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
.Cálculo de la media (media) usando reduce y ES6:
fuente
en general, el uso promedio de reducción de una línea es así
específicamente a la pregunta formulada
una versión eficiente es como
Comprender la matriz de Javascript Reducir en 1 minuto http://www.airpair.com/javascript/javascript-array-reduce
Como señaló Gotofritz, parece Array.reduce omite valores indefinidos. Así que aquí hay una solución:
fuente
elements.length!=0?elements.length:1
También se puede escribir así:elements.length || 1
que es más corto y más fácil de leer.Imaginemos que tenemos una serie de enteros como este:
El promedio se obtiene con la siguiente fórmula
A = (1 / n) Σxi (con i = 1 a n) ... Entonces: x1 / n + x2 / n + ... + xn / n
Dividimos el valor actual por el número de valores y agregamos el resultado anterior al valor devuelto.
La firma del método reduce es
La función de reducción de devolución de llamada toma los siguientes parámetros:
El segundo parámetro de reducción es el valor predeterminado ... (Se usa en caso de que la matriz esté vacía ).
Entonces, el método de reducción promedio será:
Si lo prefiere, puede crear una función separada
Y luego simplemente consulte la firma del método de devolución de llamada
O aumente el prototipo de matriz directamente ...
Es posible dividir el valor cada vez que se llama al método de reducción.
O incluso mejor , usando el Array.protoype.sum () previamente definido
método, optimice el proceso de llamar a la división solo una vez :)
Luego, en cualquier objeto Array del alcance:
NB: una matriz vacía con retorno de un deseo NaN es más correcta que 0 en mi punto de vista y puede ser útil en casos de uso específicos.
fuente
También puede usar lodash , _.sum (array) y _.mean (array) en la parte Math (también tiene otras cosas convenientes).
fuente
No es el más rápido, pero el más corto y en una línea está usando map () & reduce ():
fuente
[7,14,21].reduce((avg,e,i,arr)=>avg+e/arr.length,0);
pero con un comportamiento diferente en una matriz vacía. Si desea que el resultado esté vacío en una matriz vacía:[].reduce((a,e,i,arr)=>(a?a:0)+e/arr.length,"")
for (var avg = 0, length = i = arr.length; i--;) avg += arr[i] / length
Mucho más claro, más corto y mucho más rápidoUna manera furtiva de hacerlo es que requiere el uso de (el muy odiado) eval ().
Solo pensé en publicar esto como una de esas opciones 'fuera de la caja'. Nunca se sabe, la astucia podría otorgarle (o quitarle) un punto.
fuente
eval()
problema posible que puedo ver es que debe asegurarse de que la matriz contenga solo números (lo que, por supuesto, también es cierto para todas las demás respuestas aquí). Las entradas no numéricas se bloquean con unReferenceError
oSyntaxError, except nested arrays of numbers which introduce
, `causando un total numérico incorrecto. Y, por supuesto, en el lado del servidor JS, por ejemplo, node.js, entonces, naturalmente,eval()
podría presentar problemas de seguridad. Pero esto se ve perfecto para cualquier uso bien estructurado del lado del cliente.eval()
esto: consulte la sección de rendimiento de nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstoodYo uso estos métodos en mi biblioteca personal:
EDITAR: Para usarlos, simplemente solicite a la matriz su suma o promedio, como:
fuente
En navegadores preparados para ES6, este polyfill puede ser útil.
Puede compartir el mismo método de llamada entre
Math.sum
,Math.avg
yMath.max
, comopuedes usar Math.sum como
o si tiene una matriz para resumir, puede usar
al igual que
fuente
Array.prototype
, creo que agregar un tema alMath
objeto es una mejor opción: todos son "manejadores de números".¡Aquí hay una adición rápida al objeto "Math" en javascript para agregarle un comando "promedio"!
¡Entonces tengo esta adición al objeto "Matemáticas" para obtener la suma!
Entonces todo lo que haces es
Y donde puse la matriz de marcador de posición solo paso su variable (¡La entrada si son números puede ser una cadena debido a que se analiza a un número!)
fuente
establezca su contador de bucle for en 0 ... está obteniendo el elemento 9 y luego ha terminado como lo tiene ahora. Las otras respuestas son matemáticas básicas. Use una variable para almacenar su suma (necesita convertir las cadenas en ints) y divida por la longitud de su matriz.
fuente
Comience definiendo todas las variables que planeamos usar. Notarás que para el
numbers
matriz, estoy usando la notación literal de[]
opuesta al método constructorarray()
. Además, estoy usando un método más corto para establecer múltiples variables en 0.A continuación, rellenaré mi matriz de números vacíos con los valores del 0 al 11. Esto es para llevarme al punto de partida original. Tenga en cuenta cómo estoy empujando en la matriz
count++
. Esto empuja el valor actual de conteo, y luego lo incrementa para la próxima vez.Por último, estoy realizando una función "para cada" de los números en la matriz de números. Esta función manejará un número a la vez, que estoy identificando como "n" dentro del cuerpo de la función.
Al final, podemos generar tanto el
sum
valor como elavg
valor en nuestra consola para ver el resultado:Véalo en acción en línea en http://jsbin.com/unukoj/3/edit
fuente
Solo estoy aprovechando la respuesta de Abdennour TOUMI. Estas son las razones por qué:
1.) Estoy de acuerdo con Brad, no creo que sea una buena idea extender un objeto que no creamos.
2.)
array.length
es exactamente confiable en javascript, prefieroArray.reduce
porquea=[1,3];a[1000]=5;
ahoraa.length
volvería1001
.fuente
Luego :
fuente
En los navegadores de hoja perenne, puede usar las funciones de flecha
avg = [1,2,3].reduce((a,b) => (a+b);
Ejecutándolo 100,000 veces, la diferencia de tiempo entre el enfoque for loop y reduce es insignificante.
fuente
console.time
&console.timeEnd
Promedio más corto de un trazador de líneas:
Sum Shortest One Liner:
fuente
Sólo por diversión:
fuente
Creo que podemos hacer como
Estoy usando parseFloat dos veces porque cuando 1) agrega (a) 9 + b ("1"), el resultado será "91" pero queremos sumar. así que usé parseFloat
2) Cuando se agrega (a) 9 + parseFloat ("1"), el resultado será "10" pero estará en una cadena que no queremos, así que nuevamente utilicé parseFloat.
Espero estar claro. Sugerencias son bienvenidas
fuente
Aquí está mi manera novata de simplemente encontrar el promedio. Espero que esto ayude a alguien.
fuente
Aquí está tu único revestimiento:
fuente
Creo que esta puede ser una solución directa para calcular el promedio con un bucle y una función.
fuente
Parece que hay un sinfín de soluciones para esto, pero me pareció conciso y elegante.
O más consistentemente:
Dependiendo de su navegador, es posible que necesite hacer llamadas a funciones explícitas porque las funciones de flecha no son compatibles:
O:
fuente
Si necesita el promedio y puede omitir el requisito de calcular la suma, puede calcular el promedio con una sola llamada de reducción:
fuente
Si alguien lo necesita, aquí hay un promedio recursivo.
En el contexto de la pregunta original, es posible que desee utilizar el promedio recursivo si permitió que el usuario inserte valores adicionales y, sin incurrir en el costo de visitar cada elemento nuevamente, desea "actualizar" el promedio existente.
Cómo:
esto funciona manteniendo el promedio actual y el recuento de elementos. Cuando se va a incluir un nuevo valor, incrementa el recuento en 1, escala el promedio existente en
(count-1) / count
y agreganewValue / count
al promedio.Beneficios:
Desventajas:
BigNumber
fuente
Promedio de itens de contenido HTML
Con jQuery o Javascript
querySelector
tiene acceso directo a datos formateados ... Ejemplo:Entonces, con jQuery tienes
Vea otras 4 formas más (!) Para acceder a itens y promediarlo: http://jsfiddle.net/4fLWB/
fuente
var arr = [1,2,3,4,5]
avg (arr) ====== >>>> 3
Esto funciona con cadenas como números o números en la matriz.
fuente
fuente
Recomendaría D3 en este caso. Es el más legible (y proporciona 2 tipos diferentes de promedios)
fuente