2010-07-30 16 views

Respuesta

12

Otro enfoque, una simple función iterativa:

function sum(arr) { 
    var result = 0, n = arr.length || 0; //may use >>> 0 to ensure length is Uint32 
    while(n--) { 
    result += +arr[n]; // unary operator to ensure ToNumber conversion 
    } 
    return result; 
} 

var x = [1.2, 3.4, 5.6]; 
sum(x); // 10.2 

Sin embargo, anothe Enfoque de I utilizando Array.prototype.reduce:

var arr = [1.2, 3.4, 5.6]; 
arr.reduce(function (a, b) { return a + b; }, 0); // 10.2 

El método reduce es parte de la norma 5ª edición de ECMAScript, está ampliamente disponible, pero no es en IE < = 8, sin embargo, un cayo aplicación incluirse desde el Mozilla Dev Center I vinculado.

+3

+1 para 'reducir'. –

+0

Me gusta especialmente el uso de reducir. De alguna manera, no se usa mucho, y personalmente siento que merece más tomadores. +1 – dhruvbird

+0

+1 Guau, muy conciso. – twneale

7

supongo que no hay nada ... pero se puede hacer uno por javascript

Array.prototype.sum = function() { 
    return (! this.length) ? 0 : this.slice(1).sum() + 
     ((typeof this[0] == 'number') ? this[0] : 0); 
}; 

lo utilizan como,

[1,2,3,4,5].sum() //--> returns 15 
[1,2,'',3,''].sum() //--> returns 6 
[].sum() //--> returns 0  
x = [1.2, 3.4, 5.6] 
x.sum(); // returns 10.2 

demo


bien como se ha señalado en el comente, también puede hacerlo de manera no recursiva

Array.prototype.sum = function() { 
    var num = 0; 
    for (var i = 0; i < this.length; i++) { 
     num += (typeof this[i] == 'number') ? this[i] : 0; 
    } 
    return num; 
}; 

Otra manera de hacerlo, a través de la función ..

function sum(arr) { 
    var num = 0; 
    for (var i = 0; i < arr.length; i++) { 
     num += (typeof arr[i] == 'number') ? arr[i] : 0; 
    } 
    return num; 
}; 

utilizarlo como,

sum([1,2,3,4,5]) //--> returns 15 
x = [1.2, 3.4, 5.6] 
sum(x); // returns 10.2 
+2

sólo por curiosidad, ¿no sería esta implementación recursiva golpear fácilmente el límite de la pila? ¿Alguna razón para no usar una solución iterativa con un bucle for? – catchmeifyoutry

+4

Esta es una solución terrible. Por favor, no vayas a modificar prototipos de objetos. Me he encontrado con serios problemas con este tipo de tonterías. Escribe un plugin $ .sum jQuery, y no te metas al resto de nosotros. –

+0

@Stefan Kendall ¿me puede dar algo para leer o cualquier otra cosa? 'modificación de prototipos de objetos' ...;) – Reigel

Cuestiones relacionadas