daggett
daggett

Reputation: 277

Javascript reduce not working after function?

Not too sure where I've gone wrong here, expecting to factorialize 5 (1*2*3*4*5 = 120) by turning 5 into a string of [1,2,3,4,5] and then using reduce to multiply the string all together. When I run the code, it just gives me [1,2,3,4,5]...

 var arr = [];

function factorialize(num) {

 for (var i = 1; i <= num; i++) {
  arr.push(i);
}
  return arr;
}

var factors = 0;

factors = arr.reduce(function(previousVal, currentVal) {
  return previousVal * currentVal;
}, 0); // Expecting 120, instead result = [1,2,3,4,5]

factorialize(5);

Forgive the long route - my first week of Javascript!

Upvotes: 1

Views: 685

Answers (6)

Naga Sai A
Naga Sai A

Reputation: 10975

Issue is with the initial value set to 0 and instead of multiplying numbers, it is being added

arr.reduce(callback, initValue)

arr = [1,2,3,4,5]

In the code provided, it accumulates in below format

arr.reduce(function(previousVal, currentVal) {
  return previousVal + currentVal;
}, 0);

First call -> 0 + 1 = 1 (factors = 1)
Second call -> 0 + 2 = 2 (factors = 2)
First call -> 0 + 3 = 3 (factors = 3)
First call -> 0 + 4 = 4 (factors = 10)
First call -> 0 + 5 = 5 (factors = 15)

To achieve expected result, use below option

var arr = []; // initialize array arr

function factorialize(num) {
//for loop to push 1,2 ,3, 4, 5 to arr array
 for (var i = 1; i <= num; i++) {
  arr.push(i);
}
// return arr.reduce value by multiplying all values in array, default initial value is first element 
  return arr.reduce(function(previousVal, currentVal) {
  //console log to debug and display loop values
  console.log(previousVal, currentVal);
  return previousVal * currentVal;
});
}

console.log("output", factorialize(5));

code sample - https://codepen.io/nagasai/pen/YaQKZw?editors=1010

Upvotes: 0

Djaouad
Djaouad

Reputation: 22766

arr is empty, you should give it the resulting array of the factorisation first, and you should multiply, not add, and when multiplying, the starting value is 1 not 0:

var arr = [];

function factorialize(num) {
  for (var i = 1; i <= num; i++) {
    arr.push(i);
  }
  return arr;
}

arr = factorialize(5); // give it the value

var factors = arr.reduce(function(previousVal, currentVal) {
  return previousVal * currentVal; // multiply, don't add
}, 1); // start with 1 when multiplying

console.log(arr);
console.log(factors);

If you just want to calculate the factorial:

function factorial(num) {
  var res = 1;
  for (var i = 2; i <= num; i++) {
    res *= i;
  }
  return res;
}
console.log('factorial(5) = ' + factorial(5));
console.log('factorial(10) = ' + factorial(10));

Upvotes: 2

Nina Scholz
Nina Scholz

Reputation: 386560

You could get first the factors and then multiply in Array#reduce the factors.

I suggest to name the function what it does and move the array declaration inside of the function, because the function returns this array.

For getting the product, you need to multiply the values and use 1 as neutral start value for getting a product out of the numbers.

function getFactors(num) {
    var i, arr = [];

    for (i = 1; i <= num; i++) {
        arr.push(i);
    }

    return arr;
}

var factors = getFactors(5),
    product = factors.reduce(function(previousVal, currentVal) {
        return previousVal * currentVal;
    }, 1);

console.log(factors);
console.log(product);

Upvotes: 1

Aliaga Aliyev
Aliaga Aliyev

Reputation: 425

var arr = [];
function factorialize(num) {
    for (var i = 1; i <= num; i++) {
        arr.push(i);
    }
    var factors = 0;
    factors = arr.reduce(function (previousVal, currentVal) {
        return previousVal * currentVal;
    });
    return factors
}

factorialize(5); // 120

Upvotes: 1

yajiv
yajiv

Reputation: 2941

You are not calling factors. factorialize(5); by doing this you are just calling function factorialize(num) which will give you array(of 1...num).

(Additional info)And also in reduce you are adding + instard of multiplying * so change that too and

factors = arr.reduce(function(previousVal, currentVal) {
  return previousVal + currentVal;
}, 0);
   ^
   |_  either initialize it to 1 or remove this.

See below code. I just create array and then apply reduce on that array.

function factorialize(num) {
 var arr = [];
 for (var i = 1; i <= num; i++) {
  arr.push(i);
 }
 return arr.reduce(function(previousVal, currentVal) {
      return previousVal * currentVal;
  });
}


console.log(factorialize(5));

Upvotes: 1

Ele
Ele

Reputation: 33726

  • Put the global variable arr inside of the function factorialize.
  • Get the returned array and then execute the function reduce.
  • You need to multiply rather than to add the numbers.
  • Start the reduce with initialValue = 1, this is to avoid 0 * n.

function factorialize(num) {
  var arr = [];
  for (var i = 1; i <= num; i++) {
    arr.push(i);
  }
  return arr;
}

var arr = factorialize(5);
var factors = arr.reduce(function(previousVal, currentVal) {
  return previousVal * currentVal;
}, 1);

console.log(factors)

Upvotes: 0

Related Questions