Dada uma matriz [1, 2, 3, 4]
, como posso encontrar a soma de seus elementos? (Nesse caso, a soma seria 10
.)
Eu pensei que $.each
poderia ser útil, mas não tenho certeza de como implementá-lo.
javascript
jquery
arrays
akano1
fonte
fonte
a[0] + a[1] + ...
, que pode se transformar em concatenação de strings se a matriz tiver elementos não numéricos. Por exemplo['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
.[1,2,3].reduce(Math.sum)
.Respostas:
Recomendado (reduzir com valor padrão)
Array.prototype.reduce pode ser usado para iterar pela matriz, adicionando o valor atual do elemento à soma dos valores anteriores.
Sem valor padrão
Você recebe um TypeError
Antes das funções de seta do ES6
Entradas não numéricas
Se não-números são possíveis entradas, você pode querer lidar com isso?
Uso de avaliação perigoso não recomendado
Podemos usar eval para executar uma representação em string do código JavaScript. Usando a função Array.prototype.join para converter a matriz em uma string, alteramos [1,2,3] para "1 + 2 + 3", que é avaliado em 6.
É claro que exibir um alerta não é a pior coisa que poderia acontecer. A única razão pela qual incluí isso é como resposta à pergunta de Ortund, pois não acho que tenha sido esclarecida.
fonte
reduce()
ainda é 25 a 30% mais lenta que um simplesfor()
loop indexado após longos anos? jsperf.com/reduce-vs-loop/4No Lisp , esse seria exatamente o trabalho
reduce
. Você veria esse tipo de código:Felizmente, em JavaScript, também temos
reduce
! Infelizmente,+
é um operador, não uma função. Mas podemos torná-lo bonito! Olhe aqui:Isso não é bonito? :-)
Melhor ainda! Se você estiver usando o ECMAScript 2015 (também conhecido como ECMAScript 6 ), pode ser assim:
fonte
[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; }
Por que não reduzir? Geralmente é um pouco contra-intuitivo, mas usá-lo para encontrar uma soma é bem direto:
fonte
reduce()
?Array.prototype.reduce()
reduz uma matriz para um único valor de retorno.fonte
(var i=0; i<arr.length; i++)
é ainda mais rápido. E mesmo assim, o usovar sum=0; var i=arr.length; while(i--) sum += arr[i]
é ainda mais rápido.for... in
loops em matrizes funciona nesse caso _ coincidentemente_ e porque matrizes estendem objetos. A solução da Riking é melhorfor...in
loop em JavaScript pega os índices, que é um obstáculo comum para os codificadores que esperam obter os valores. (Tentefor(var i in [1,2,3]) { console.log(i); }
em um console.)fonte
reduce
abaixo; não declare vars mutáveis quando você não tiver também.Se você estiver usando o Lodash, poderá usar a função soma
fonte
Isso é possível repetindo todos os itens e adicionando-os em cada iteração a uma
sum
variável.O JavaScript não sabe o escopo do bloco, por isso
sum
será acessível:O mesmo que acima, porém anotado e preparado como uma função simples:
fonte
sum
fora do loop muito mais legível.const
elet
. Então você pode declararsum
fora dofor
loop comolet sum = 0;
. Você também pode armazenar em cache o comprimento da matriz antes do loop comoconst length = array.length;
Referência: Array.prototype.reduce ()
fonte
arr
for[]
.arr.reduce(function (a, b) { return a + b; }, 0);
Isso levará em média 1,57 ms / corrida (medido em 1000 execuções em uma matriz de 100 números normais aleatórios), comparado a 3.604 ms / corrida com o
eval()
método acima e 2.151 ms / corrida com um padrão para (i, comprimento, ++ ) ciclo.Observação sobre a metodologia: esse teste foi executado em um servidor de scripts do Google Apps, portanto, seus mecanismos javascript são praticamente os mesmos do Chrome.
EDIT: em
--i
vez dei--
economiza 0,12 ms cada execução (i-- é 1,7)Edição: Santo palavrão, não importa todo este post. Use o método reduzir () mencionado acima, é apenas 1 ms / corrida.
fonte
while (--i) do_something
pode funcionar para outras coisas também.var sum = arr[0]
Você também pode usar o reduzaRight.
que resulta como 21.
Referência: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
fonte
Alguém está procurando um oneliner funcional como eu? Pegue isso:
fonte
arr.reduce(function(a, b) { return a + b;}, 0);
OK, imagine que você tenha esta matriz abaixo:
Vamos começar a procurar várias maneiras diferentes de fazer isso, pois não encontrei nenhuma resposta abrangente aqui:
1) Usando redução interna ()
2) Usando o loop for
3) Usando o loop while
4) Usando a matriz forEach
e chame assim:
Não é recomendável prototipar algo assim para o Array ...
fonte
Abordagem engraçada:
fonte
reduce
Definitivamente, o uso é preferível para a maioria, se não todos, os casos.[1,"2;YourProgram.ripToShreds();3",4]
NaN
tentando aoeval(['alert("removing your computer")',2,3].join("+"))
responder a resposta errada 0/10Uma solução JavaScript padrão:
Isso funciona para mim (o resultado deve ser 5). Espero que não exista desvantagem oculta nesse tipo de solução.
fonte
Dessa forma, você pode colocar todos os tipos de coisas exóticas na matriz.
Estou apenas brincando.
fonte
eval(['alert("removing your computer")',2,3].join("+"))
Sou iniciante em JavaScript e codificação em geral, mas descobri que uma maneira simples e fácil de somar os números em uma matriz é assim:
Basicamente, eu queria contribuir com isso porque não encontrei muitas soluções que não usem funções internas, e esse método é fácil de escrever e entender.
fonte
Um pequeno pedaço de código JavaScript faria este trabalho:
fonte
Algumas pessoas sugeriram adicionar um
.sum()
método aoArray.prototype
. Isso geralmente é considerado uma prática ruim, então não estou sugerindo que você faça isso.Se você ainda insistir em fazê-lo, esta é uma maneira sucinta de escrevê-lo:
então:
[1,2].sum(); // 3
Observe que a função adicionada ao protótipo está usando uma mistura da função ES5 e ES6 e sintaxe da seta. O
function
é declarado para permitir que o método obtenha othis
contexto a partir doArray
qual você está operando. Eu usei a=>
brevidade dentro dareduce
ligação.fonte
Use um
for
loop:Ou até um
forEach
loop:Para simplificar, use
reduce
:fonte
Não precisa
initial value
! Porque se nãoinitial value
for passado, elecallback function
não será chamado no primeiro elemento da lista e o primeiro elemento será passado como oinitial value
. Very c OO l feature :)fonte
Aqui está uma solução elegante de uma linha que usa o algoritmo de pilha , embora possa levar algum tempo para entender a beleza dessa implementação.
Basicamente, a função aceita uma matriz e verifica se a matriz contém exatamente um item. Se falso, ele remove o último item da pilha e retorna a matriz atualizada.
A beleza desse snippet é que a função inclui a
arr[0]
verificação para evitar loop infinito. Quando atinge o último item, ele retorna a soma inteira.fonte
Você pode combinar o método reduzem () com a expressão lambda:
fonte
Usar
reduce
fonte
eu vi todas as respostas indo para a solução 'reduzir'
fonte
Precisão
Classifique a matriz e inicie a soma dos menores números (o snippet mostra a diferença com a não classificação)
Mostrar snippet de código
Para matriz multidimensional de números, use
arr.flat(Infinity)
Mostrar snippet de código
fonte
Truques legais aqui, eu tenho uma escolha nítida com muitas das respostas tradicionais seguras que não armazenam em cache o comprimento da matriz.
Sem armazenar em cache o comprimento da matriz, o compilador JS precisa percorrer a matriz com todas as iterações do loop para calcular o comprimento; na maioria dos casos, é uma sobrecarga desnecessária. A V8 e muitos navegadores modernos otimizam isso para nós, por isso é menos preocupante do que era, mas existem dispositivos mais antigos que se beneficiam desse cache simples.
Se o comprimento estiver sujeito a alterações, o armazenamento em cache poderá causar efeitos colaterais inesperados, se você não souber por que está armazenando o tamanho em cache, mas para uma função reutilizável cujo único objetivo é pegar uma matriz e adicionar os valores juntos, é um ótimo ajuste.
Aqui está um link CodePen para esta função arraySum. http://codepen.io/brandonbrule/pen/ZGEJyV
É possível que essa seja uma mentalidade desatualizada que esteja presa a mim, mas não vejo uma desvantagem em usá-la nesse contexto.
fonte
Essas são realmente ótimas respostas, mas, se os números estiverem em sequência, como na pergunta (1,2,3,4), você poderá fazer isso facilmente aplicando a fórmula (n * (n + 1)) / 2 em que n é o último número
fonte
fonte
Isso é muito mais fácil
fonte
Um exemplo simples de método:
fonte