Anonymous_8712
Anonymous_8712

Reputation: 49

Javascript - simple exercises

I have a task to write a function getEvenAverage, which should take only one argument - array. This function should return an average value of even numbers from this array. If in the array there aren't any even numbers the function should return null.

I'd really appreciate any feedback :-)

function getEvenAverage(tab) {
  {
    if (i % 2 === 0) {
      for (var i = 0; i < tab.length; i++) {
        sum += parseInt(tab[i], 10);
      }
      var avg = sum / tab.length;
    } else
      console.log('null');
  }
}

Upvotes: 3

Views: 480

Answers (7)

Meysam Razmi
Meysam Razmi

Reputation: 53

Here is the correct function.

function getEvenAverage(tab) {
    if (!Array.isArray(tab)) return null;

    let sum = 0, count = 0;
    for (let i = 0; i < tab.length; i++) {
      if (tab[i] % 2 === 0) {
        sum += parseInt(tab[i]);
        count++;
      }
    }
    return count > 0 ? (sum / count) : null;
}

Wish You happy coding.

Upvotes: 0

iliasse
iliasse

Reputation: 257

function getEvenAverage(arr){
  var evenNumbers = []; // we use an array to hold all of our evenNumbers
  for  (var el of arr){ // we loop over the received array to check the received
    if(el % 2 !=0){ // if the number is even
      evenNumbers.push(el); // we add it to our evenNumbers array
    }
  }
  if(evenNumbers.length == 0){ // when we have no even Number
    return false; // we then return false
  }
  else{
    // the next block of code calculates the average of the even values
    return evenNumbers.reduce((pv,cv) => pv+cv,0)/evenNumbers.length;
  }
}

var evenNumbers = [4,2,3,6,5,9];
getEvenAverage(evenNumbers); // returns 5.666666666666667
getEvenAverage([2,4,6,8]); // returns false

Upvotes: 0

Oram
Oram

Reputation: 1673

You need only the even numbers, so first filter the array into a new array, then sum all the numbers (using reduce or a for loop) and divide by its length.

function getEvenAverage(array) {
  if (!Array.isArray(array)) return null; // not a must if you're sure you pass an array
  var evenArray = array.filter(function(value) {
    return value % 2 === 0
  });
  if (evenArray.length === 0) return null;
  var evenSum = evenArray.reduce(function(total, current) {
    return total + current;
  });
  var evenAvg = evenSum / evenArray.length;
  return evenAvg;
}

console.log(getEvenAverage("not an array"));
console.log(getEvenAverage([1,3,7])); // no even numbers
console.log(getEvenAverage([1,2,3])); // single even number
console.log(getEvenAverage([2,2,2])); // only even numbers
console.log(getEvenAverage([1,2,3,10,18])); // bigger array
console.log(getEvenAverage([0,1])); // 0 is also even

Upvotes: 0

Sabith
Sabith

Reputation: 1656

Try this function,

function getEvenAverage(tab) {
        var numberOfEvens = 0;
        var sum = 0;
        for(var i=0;i<tab.length;i++){
             if(tab[i]%2 == 0 ){
                 numberOfEvens++;
                 sum += tab[i];
             }
        }
        if(numberOfEvens == 0)return null;
        return sum/numberOfEvens;
    }
    
    console.log(getEvenAverage([0,1,2,3,4,5]))
    console.log(getEvenAverage([1,2,3,4,5]))
    console.log(getEvenAverage([0,1,11,3,4,5]))
    console.log(getEvenAverage([1,5,3]))

Upvotes: 0

Sreekanth
Sreekanth

Reputation: 3130

You could also do it with the array reduce, with a single array traversal

const reducer = (acc, val) => {
  let {
    sum,
    count
  } = acc;
  return (val % 2 === 0 ? {
    sum: sum + val,
    count: count + 1
  } : acc);
};

const getEvenAverage = (input) => {
  const initialValue = {
    sum: 0,
    count: 0
  };
  const output = input.reduce(reducer, initialValue);

  if (output.count === 0) {
    return null;
  } else {
    return output.sum / output.count;
  }
};

console.log(getEvenAverage([1, 2, 3]));

Upvotes: 2

Jack Bashford
Jack Bashford

Reputation: 44105

You say you need to return something, so return it. Also move your if statement inside your for loop, and fix a few other syntax errors. And as pointed out in the comments, you should divide sum by the number of even numbers to get your avg:

function getEvenAverage(tab) {
  var sum = 0;
  var evens = 0;
  for (var i = 0; i < tab.length; i++) {
    if (i % 2 === 0) {
      sum += parseInt(tab[i], 10);
      evens++;
    } 
  }
  if (evens == 0) {
    console.log("null");
    return null;
  } else {
    var avg = sum / evens;
    return avg;
  }
}

console.log(getEvenAverage([1, 2, 3]));

Upvotes: 3

Sachin
Sachin

Reputation: 179

Other than using a for loop, you can utilize filter and reduce Array methods.

function getEvenAverage(arr) {
  const newArr = arr.filter(number => number % 2 === 0);
  return newArr.length > 0 ? newArr.reduce((acc, num) => acc + num) / newArr.length : null;
}

console.log(getEvenAverage([1, 2, 3, 4]));
console.log(getEvenAverage([1, 3, 5, 7]));

Upvotes: 0

Related Questions