2010-07-30 7 views

risposta

12

Un altro approccio, una semplice funzione 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 

Ancora un altro approccio r utilizzando Array.prototype.reduce:

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

Il metodo reduce fa parte della 5a edizione, ECMAScript, è ampiamente disponibile, ma non è su IE < = 8, tuttavia un cay implementazione essere inclusa dalla Mozilla Dev Center I linked.

+3

+1 per 'reduce'. –

+0

Mi piace particolarmente l'uso di ridurre. In qualche modo, non è molto usato, e personalmente ritengo che meriti più acquirenti. +1 – dhruvbird

+0

+1 Wow, davvero conciso. – twneale

7

Penso che non c'è nessuno ... ma si può fare uno su JavaScript

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

usano come,

[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


Va bene come sottolineato nella commento, puoi anche farlo come metodo non ricorsivo

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; 
}; 

Un altro modo per farlo, attraverso la funzione ..

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

usarlo come,

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

solo per curiosità, non sarebbe questa implementazione ricorsiva facilmente raggiunto il limite dello stack? Qualche ragione per non usare una soluzione iterativa con un ciclo for? – catchmeifyoutry

+4

Questa è una soluzione terribile. Per favore non andare a modificare prototipi di oggetti. Ho incontrato seri problemi con questo tipo di assurdità. Scrivi un plugin jQuery $ .sum e non rovinare il resto di noi. –

+0

@Stefan Kendall puoi darmi qualcosa da leggere o altro? 'modificando prototipi di oggetti' ...;) – Reigel

Problemi correlati