Estou tendo problemas para adicionar todos os elementos de uma matriz e fazer a média deles. Como eu faria isso e o implementaria com o código que tenho atualmente? Os elementos devem ser definidos como eu abaixo.
<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
fonte
fonte
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
seria muito melhor.Respostas:
Basta percorrer a matriz, já que seus valores são cadeias de caracteres, eles devem ser convertidos em um número inteiro primeiro. E a média é apenas a soma dos valores divididos pelo número de valores.
fonte
for(var i = 0; i < elmt.length; i++;)
comfor(var i = 0, l = elmt.length; i < l; i++)
sum += parseInt(elmt[i], 10);
assumindo elmt [i] é da base 10. ligaçãoUma solução que considero mais elegante:
fonte
sum/times.length
etapa):var avg = times.reduce(function(p,c,i){return p+(c-p)/(i+1)},0);
times.reduce((a,b) => (a+b)) / times.length;
ES6
fonte
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 da média (média) usando reduzir e ES6:
fonte
geralmente média usando one-liner reduzir é assim
especificamente para a pergunta
uma versão eficiente é como
Compreender a matriz de Javascript Reduzir em 1 minuto http://www.airpair.com/javascript/javascript-array-reduce
como gotofritz apontou, parece que Array.reduce ignora valores indefinidos. então aqui está uma correção:
fonte
elements.length!=0?elements.length:1
Também pode ser escrito assim:elements.length || 1
que é mais curto e mais fácil de ler.Vamos imaginar que temos uma matriz de números inteiros como este:
A média é obtida com a seguinte fórmula
A = (1 / n) Σxi (com i = 1 para n) ... Então: x1 / n + x2 / n + ... + xn / n
Dividimos o valor atual pelo número de valores e adicionamos o resultado anterior ao valor retornado.
A assinatura do método de redução é
A função de redução de retorno de chamada utiliza os seguintes parâmetros:
O segundo parâmetro de redução é o valor padrão ... (Usado no caso de a matriz estar vazia ).
Portanto, o método de redução média será:
Se preferir, você pode criar uma função separada
E, em seguida, basta consultar a assinatura do método de retorno de chamada
Ou aumente o protótipo da matriz diretamente.
É possível dividir o valor cada vez que o método de redução é chamado.
Ou melhor ainda , usando o Array.protoype.sum () definido anteriormente
método, otimizar o processo chamando a divisão apenas uma vez :)
Então, em qualquer objeto Array do escopo:
Nota: um array vazio com retorno de um desejo NaN é mais correto que 0 no meu ponto de vista e pode ser útil em casos de uso específicos.
fonte
Você também pode usar lodash , _.sum (array) e _.mean (array) na parte Math (também possui outros itens convenientes).
fonte
Não é o mais rápido, mas o mais curto e em uma linha está usando map () e reduza ():
fonte
[7,14,21].reduce((avg,e,i,arr)=>avg+e/arr.length,0);
mas com comportamento diferente na matriz vazia. Se você deseja que o resultado fique vazio na matriz vazia:[].reduce((a,e,i,arr)=>(a?a:0)+e/arr.length,"")
for (var avg = 0, length = i = arr.length; i--;) avg += arr[i] / length
Muito mais clara, mais curto e mais rápidoUma maneira sorrateira de fazê-lo, embora exija o uso de (o tão odiado) eval ().
Só pensei em postar isso como uma daquelas opções 'fora da caixa'. Você nunca sabe, a astúcia pode lhe conceder (ou tirar) um ponto.
fonte
eval()
problema possível é que você precisa garantir que a matriz contenha apenas números (o que, obviamente, também é válido para todas as outras respostas aqui). Entradas não numéricas falham com umReferenceError
ouSyntaxError, except nested arrays of numbers which introduce
, `causando um total numérico incorreto. E, é claro, no JS do lado do servidor, por exemplo, node.js, naturalmenteeval()
pode apresentar problemas de segurança. Mas isso parece perfeito para qualquer uso bem estruturado do lado do cliente.eval()
como este - veja a seção desempenho de nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstoodEu uso esses métodos na minha biblioteca pessoal:
EDIT: Para usá-los, basta pedir ao array sua soma ou média, como:
fonte
Em navegadores prontos para ES6, esse polyfill pode ser útil.
Você pode compartilhar o mesmo método de chamada entre
Math.sum
,Math.avg
eMath.max
, comovocê pode usar Math.sum como
ou se você tiver uma matriz para resumir, poderá usar
Assim como
fonte
Array.prototype
, acho que adicionar tema aoMath
objeto é uma escolha melhor - todos eles são "manipuladores de números".Aqui está uma rápida adição ao objeto "Math" em javascript para adicionar um comando "médio" a ele !!
Então eu tenho essa adição ao objeto "Math" para obter a soma!
Então tudo que você faz é
E onde eu coloquei a matriz de espaço reservado, basta passar sua variável (a entrada, se forem números, pode ser uma string por causa da análise de um número!)
fonte
defina seu contador de loop for como 0 .... você está obtendo o elemento 9 e, em seguida, está pronto como o possui agora. As outras respostas são matemática básica. Use uma variável para armazenar sua soma (é necessário converter as strings em ints) e divida pelo comprimento da matriz.
fonte
Comece definindo todas as variáveis que planejamos usar. Você notará que, para a
numbers
matriz, estou usando a notação literal[]
em oposição ao método construtorarray()
. Além disso, estou usando um método mais curto para definir várias variáveis como 0.Em seguida, estou preenchendo minha matriz de números vazios com os valores de 0 a 11. Isso é para me levar ao seu ponto de partida original. Observe como estou pressionando a matriz
count++
. Isso pressiona o valor atual de count e o incrementa para a próxima vez.Por fim, estou executando uma função "para cada" dos números na matriz de números. Essa função manipulará um número de cada vez, que eu estou identificando como "n" no corpo da função.
No final, podemos gerar o
sum
valor e oavg
valor para nosso console para ver o resultado:Veja em ação online em http://jsbin.com/unukoj/3/edit
fonte
Estou apenas aproveitando a resposta de Abdennour TOUMI. Aqui estão as razões do porquê:
1.) Concordo com Brad, não acho que seja uma boa ideia estender um objeto que não criamos.
2.)
array.length
é exatamente confiável em javascript, prefiroArray.reduce
porquea=[1,3];a[1000]=5;
, agoraa.length
retornaria1001
.fonte
Então :
fonte
Em navegadores sempre verdes, você pode usar as funções de seta
avg = [1,2,3].reduce((a,b) => (a+b);
Ao executá-lo 100.000 vezes, a diferença de tempo entre a abordagem do loop for e a redução é insignificante.
fonte
console.time
&console.timeEnd
Um forro mais curto médio:
Sum Shortest One Liner:
fonte
Apenas por diversão:
fonte
Acho que podemos fazer como
Estou usando parseFloat duas vezes porque quando 1) você adiciona (a) 9 + b ("1"), o resultado será "91", mas queremos adição. então eu usei parseFloat
2) Quando a adição de (a) 9 + parseFloat ("1") acontece, o resultado será "10", mas será na string que não queremos, então usei parseFloat.
Espero estar claro. Sugestões são bem-vindas
fonte
Aqui está o meu jeito novato de simplesmente encontrar a média. Espero que isso ajude alguém.
fonte
aqui está o seu forro:
fonte
Eu acho que isso pode ser uma solução direta para calcular a média com um loop e função.
fonte
Parece haver um número infinito de soluções para isso, mas eu achei isso conciso e elegante.
Ou de forma mais consistente:
Dependendo do seu navegador, pode ser necessário fazer chamadas de função explícitas porque as funções de seta não são suportadas:
Ou:
fonte
Se você precisar da média e puder ignorar o requisito de calcular a soma, poderá calcular a média com uma única chamada de redução:
fonte
Se alguém precisar - aqui está uma média recursiva.
No contexto da pergunta original, convém usar a média recursiva se você permitir que o usuário insira valores adicionais e, sem incorrer no custo de visitar cada elemento novamente, deseje "atualizar" a média existente.
Quão:
isso funciona mantendo a média atual e a contagem de elementos. Quando um novo valor deve ser incluído, você incrementa a contagem em 1, escala a média existente em
(count-1) / count
e adicionanewValue / count
à média.Benefícios:
Desvantagens:
BigNumber
fonte
Média de itens de conteúdo HTML
Com jQuery ou Javascript,
querySelector
você tem acesso direto a dados formatados ... Exemplo:Então, com o jQuery você tem
Veja outras 4 maneiras (!) De acessar itens e calcule a média: http://jsfiddle.net/4fLWB/
fonte
var arr = [1,2,3,4,5]
média (arr) ====== >>>> 3
Isso funciona com cadeias de caracteres como números ou números na matriz.
fonte
fonte
Eu recomendaria o D3 neste caso. É o mais legível (e fornece 2 tipos diferentes de médias)
fonte