12

Say I have an array-ish container of decimal numbers. I want the sum. In Python I would do this:

x = [1.2, 3.4, 5.6]

sum(x)

Is there a similarly concise way to do this in JavaScript?

2 Answers 2

13

Another approach, a simple iterative function:

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

Yet another approach using Array.prototype.reduce:

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

The reduce method is part of the ECMAScript 5th Edition standard, is widely available, but is not on IE <= 8, however an implementation cay be included from the the Mozilla Dev Center I linked.

Sign up to request clarification or add additional context in comments.

Comments

7

I guess there's none... but you can make one on javascript

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

use it as,

[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


Okay as pointed out in the comment, you can also do it as non-recursive way

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

Another way to do it, through function..

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

use it as,

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

8 Comments

just out of curiosity, wouldn't this recursive implementation easily hit the stack limit? Any reason not to use an iterative solution with a for loop?
This is a terrible solution. Please do not go modifying object prototypes. I've run into serious issues with this kind of nonsense. Write a $.sum jQuery plugin, and don't screw the rest of us.
@Stefan Kendall can you give me something to read or any for that matter? modifying object prototypes... ;)
@Stefan, wish I could +1000 you -- the ability to modify built-ins is one detail I classify as a defect in JS (and Ruby) and it has never given me anything but trouble (esp. in JS as I don't use Ruby much;-).
@Reigel: Give a look to this article.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.