Sum of all elements in an array
Asked Answered
S

4

5

I am a beginner in programming. I want to do the sum of all elements in an array. I made this but I can't see where are my mistakes?

function ArrayAdder(_array) {
    this.sum = 0;
    this.array = _array || [];
}

ArrayAdder.prototype.computeTotal = function () {
    this.sum = 0;
    this.array.forEach(function (value) {
        this.sum += value;
    });
    return this.sum;
};

var myArray = new ArrayAdder([1, 2, 3]);
console.log(myArray.computeTotal());
Sisely answered 16/1, 2016 at 18:5 Comment(1)
Related: #1230733Ieshaieso
H
12

this inside the forEach callback refers to the global window object. To set the context of the callback, use the Array#forEach second argument to pass the context.

this.array.forEach(function (value) {
    this.sum += value;
}, this); // <-- `this` is bound to the `forEach` callback.

function ArrayAdder(_array) {
    this.sum = 0;
    this.array = _array || [];
}

ArrayAdder.prototype.computeTotal = function () {
    this.sum = 0;
    this.array.forEach(function (value) {
        this.sum += value;
    }, this);
    return this.sum;
};

var myArray = new ArrayAdder([1, 2, 3]);

console.log(myArray.computeTotal());
document.write(myArray.computeTotal()); // For Demo purpose

If you're looking for an alternative, you can use Array#reduce, here using with Arrow function

var sum = arr.reduce((x, y) => x + y);

// Note: If this doesn't work in your browser,
// check in the latest version of Chrome/Firefox

var arr = [1, 2, 3];
var sum = arr.reduce((x, y) => x + y);

document.write(sum);
Humbug answered 16/1, 2016 at 18:11 Comment(1)
Using reduce is definitely more concise. Thanks.Pogge
S
3

Reference of this got changed in forEach function. Update your code to following

function ArrayAdder(_array) {
  this.sum = 0;
  this.array = _array || [];
}

ArrayAdder.prototype.computeTotal = function() {
  this.sum = 0;
  var that = this;
  this.array.forEach(function(value) {
    that.sum += value;
  });
  return this.sum;
};

var myArray = new ArrayAdder([1, 2, 3]);
console.log(myArray.computeTotal());

The above saved the reference of this in that and used it for computing.

Shufu answered 16/1, 2016 at 18:7 Comment(0)
I
1

The most effective way of doing this is to use the reduce array function. For example:

this.array = [0, 1, 2, 3]
this.sum = this.array.reduce(function(a, b) {
  return a + b;
});
Inarch answered 16/1, 2016 at 18:12 Comment(2)
...as found in the question I've linked... This doesn't answer this question though.Ieshaieso
Using reduce is definitely the most idiomatic way of solving this problem however. It might require some code rewriting on the asker's part, but it is definitely more effective.Inarch
A
0

Try this:

  let arr = [1, 2, 3, 4, 5];
  const sum = arr.reduce((x, y)=> x+y);
  console.log(sum);
Astilbe answered 10/10, 2022 at 0:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.