Dada una matriz [1, 2, 3, 4]
, ¿cómo puedo encontrar la suma de sus elementos? (En este caso, la suma sería 10
).
Pensé que $.each
podría ser útil, pero no estoy seguro de cómo implementarlo.
javascript
jquery
arrays
akano1
fuente
fuente
a[0] + a[1] + ...
, lo que puede convertirse en concatenación de cadenas si la matriz tiene elementos que no son números. Por ej['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
.[1,2,3].reduce(Math.sum)
.Respuestas:
Recomendado (reducir con valor predeterminado)
Array.prototype.reduce se puede usar para iterar a través de la matriz, agregando el valor del elemento actual a la suma de los valores del elemento anterior.
Sin valor por defecto
Obtienes un TypeError
Antes de las funciones de flecha de ES6
Entradas no numéricas
Si las entradas no numéricas son posibles, ¿puede manejar eso?
Uso de evaluación peligroso no recomendado
Podemos usar eval para ejecutar una representación de cadena de código JavaScript. Usando la función Array.prototype.join para convertir la matriz en una cadena, cambiamos [1,2,3] en "1 + 2 + 3", que se evalúa en 6.
Por supuesto, mostrar una alerta no es lo peor que podría pasar. La única razón por la que he incluido esto es como respuesta a la pregunta de Ortund, ya que no creo que se haya aclarado.
fuente
reduce()
aún es un 25-30% más lenta que un simplefor()
bucle indexado después de largos años? jsperf.com/reduce-vs-loop/4En Lisp , este sería exactamente el trabajo
reduce
. Verías este tipo de código:Afortunadamente, en JavaScript, ¡también tenemos
reduce
! Lamentablemente,+
es un operador, no una función. ¡Pero podemos hacerlo bonito! Aquí, mira:¿No es bonito? :-)
¡Aun mejor! Si está utilizando ECMAScript 2015 (también conocido como ECMAScript 6 ), puede ser bonito:
fuente
[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 qué no reducir? Por lo general, es un poco intuitivo, pero usarlo para encontrar una suma es bastante sencillo:
fuente
reduce()
?Array.prototype.reduce()
reduce una matriz a un solo valor de retorno.fuente
(var i=0; i<arr.length; i++)
es aún más rápido. E incluso entonces, el usovar sum=0; var i=arr.length; while(i--) sum += arr[i]
es aún más rápido.for... in
bucles en matrices funciona en este caso _ coincidentemente_ y porque las matrices extienden objetos. La solución de Riking es mejorfor...in
bucle en JavaScript toma los índices, que es un obstáculo común para los codificadores que esperan obtener los valores. (Pruébelofor(var i in [1,2,3]) { console.log(i); }
en una consola.)fuente
reduce
continuación; no declares vars mutables cuando no lo tengas también.Si estás usando Lodash, puedes usar la función de suma
fuente
Esto es posible al recorrer todos los elementos y agregarlos en cada iteración a una
sum
variable.JavaScript no conoce el alcance del bloque, por
sum
lo que será accesible:Lo mismo que arriba, sin embargo anotado y preparado como una función simple:
fuente
sum
fuera del ciclo es mucho más legible.const
ylet
. Entonces puedes declararsum
fuera delfor
ciclo comolet sum = 0;
. También puede almacenar en caché la longitud de la matriz antes del ciclo comoconst length = array.length;
Referencia: Array.prototype.reduce ()
fuente
arr
es así[]
.arr.reduce(function (a, b) { return a + b; }, 0);
Esto tomará en promedio 1.57 ms / carrera (medido más de 1000 carreras en una matriz de 100 números normales aleatorios), en comparación con 3.604 ms / carrera con el
eval()
método anterior y 2.151 ms / carrera con un estándar para (i, longitud, ++ ) lazo.Nota metodológica: esta prueba se ejecutó en un servidor de Google Apps Script, por lo que sus motores de JavaScript son prácticamente iguales a los de Chrome.
EDITAR: en
--i
lugar dei--
guardar 0,12 ms cada ejecución (i-- es 1.7)EDITAR: Santo improperio, no importa esta publicación completa. Use el método reduce () mencionado anteriormente, es solo 1 ms / ejecución.
fuente
while (--i) do_something
podría funcionar para otras cosas también.var sum = arr[0]
También puedes usar reduceRight.
que da como resultado 21.
Referencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
fuente
¿Alguien que busca una línea funcional como yo? Toma esto:
fuente
arr.reduce(function(a, b) { return a + b;}, 0);
OK, imagina que tienes esta matriz a continuación:
Comencemos a buscar muchas maneras diferentes de hacerlo, ya que no pude encontrar ninguna respuesta completa aquí:
1) Uso de reduce incorporado ()
2) Utilizando for loop
3) Usando el bucle while
4) Usar una matriz para cada
y llámalo así:
No se recomienda crear un prototipo de este tipo para Array ...
fuente
Enfoque divertido:
fuente
reduce
es definitivamente preferible para la mayoría, si no para todos, los casos.[1,"2;YourProgram.ripToShreds();3",4]
NaN
cuando intentoeval(['alert("removing your computer")',2,3].join("+"))
respuesta incorrecta 0/10Una solución estándar de JavaScript:
Esto funciona para mí (el resultado debería ser 5). Espero que no haya una desventaja oculta en este tipo de solución.
fuente
De esa manera puedes poner todo tipo de cosas exóticas en la matriz.
Solo estoy medio bromeando.
fuente
eval(['alert("removing your computer")',2,3].join("+"))
Soy un principiante con JavaScript y la codificación en general, pero descubrí que una forma simple y fácil de sumar los números en una matriz es así:
Básicamente, quería contribuir con esto porque no veía muchas soluciones que no usaran funciones integradas, y este método es fácil de escribir y entender.
fuente
Un pequeño fragmento de código JavaScript haría este trabajo:
fuente
Algunas personas han sugerido agregar un
.sum()
método alArray.prototype
. Esto generalmente se considera una mala práctica, por lo que no estoy sugiriendo que lo haga.Si aún insiste en hacerlo, esta es una forma sucinta de escribirlo:
entonces:
[1,2].sum(); // 3
Tenga en cuenta que la función agregada al prototipo está utilizando una mezcla de la función ES5 y ES6 y la sintaxis de flecha. Se
function
declara que permite que el método obtenga elthis
contexto delArray
que está operando. Usé la=>
brevedad dentro de lareduce
llamada.fuente
Usa un
for
bucle:O incluso un
forEach
bucle:Para simplificar, use
reduce
:fuente
No es necesario
initial value
! Porque si noinitial value
se pasa,callback function
no se invoca en el primer elemento de la lista, y el primer elemento se pasa comoinitial value
. Muy c OO l característica :)fuente
Aquí hay una solución elegante de una sola línea que utiliza el algoritmo de pila , aunque uno puede tomar un tiempo para comprender la belleza de esta implementación.
Básicamente, la función acepta una matriz y verifica si la matriz contiene exactamente un elemento. Si es falso, saca el último elemento de la pila y devuelve la matriz actualizada.
La belleza de este fragmento es que la función incluye la
arr[0]
comprobación para evitar bucles infinitos. Una vez que alcanza el último elemento, devuelve la suma completa.fuente
Puede combinar el método reduce () con la expresión lambda:
fuente
Utilizar
reduce
fuente
Vi todas las respuestas para la solución 'reducir'
fuente
Exactitud
Ordene la matriz y comience la suma de los números más pequeños (el fragmento muestra la diferencia con no ordenar)
Mostrar fragmento de código
Para una matriz multidimensional de números, use
arr.flat(Infinity)
Mostrar fragmento de código
fuente
Trucos geniales aquí, tengo una selección de liendres con muchas de las respuestas tradicionales seguras que no almacenan en caché la longitud de la matriz.
Sin almacenar en caché la longitud de la matriz, el compilador JS necesita recorrer la matriz con cada iteración del bucle para calcular la longitud, es una sobrecarga innecesaria en la mayoría de los casos. V8 y muchos navegadores modernos optimizan esto para nosotros, por lo que es menos preocupante de lo que era, pero hay dispositivos más antiguos que se benefician de este simple almacenamiento en caché.
Si la longitud está sujeta a cambios, el almacenamiento en caché puede causar algunos efectos secundarios inesperados si no sabe por qué está almacenando en caché la longitud, pero para una función reutilizable cuyo único propósito es tomar una matriz y agregar los valores juntos es un Gran ajuste.
Aquí hay un enlace CodePen para esta función arraySum. http://codepen.io/brandonbrule/pen/ZGEJyV
Es posible que se trate de una mentalidad desactualizada, pero no veo ninguna desventaja en usarla en este contexto.
fuente
Esas son respuestas realmente geniales, pero por si los números están en secuencia, como en la pregunta (1,2,3,4), puede hacerlo fácilmente aplicando la fórmula (n * (n + 1)) / 2 donde n es el último número
fuente
fuente
Esto es mucho más fácil
fuente
Un ejemplo de método simple:
fuente