3
votes

Javascript - exercices simples

J'ai une tâche pour écrire une fonction getEvenAverage , qui ne devrait prendre qu'un seul argument - array. Cette fonction doit renvoyer une valeur moyenne de nombres pairs de ce tableau. Si dans le tableau il n'y a pas de nombres pairs, la fonction doit retourner null .

J'apprécierais vraiment vos commentaires :-)

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


4 commentaires

Votre fonction ne renvoie rien


Je pense que vous manquez quelque chose dans votre exemple? il y a trop de parenthèses ( { } )


N'utilisez pas var , utilisez plutôt let ! (Il vous montrera directement certaines des erreurs que vous avez faites)


@emil, quelques instructions de bloc supplémentaires sont en effet déroutantes, mais elles ne changent pas la façon dont le code fonctionne :)


7 Réponses :


3
votes

Vous dites que vous devez renvoyer quelque chose, alors renvoyez-le . Déplacez également votre instruction if dans votre boucle for et corrigez quelques autres erreurs de syntaxe. Et comme indiqué dans les commentaires, vous devez diviser somme par le nombre de nombres pairs pour obtenir votre 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]));


6 commentaires

je pense que vous ne devriez pas diviser sur tab.length, plutôt sur combien de nombres pairs il y avait


Oh oui, mon mauvais @giorgim.


Corrigé maintenant @giorgim, mieux c'est?


Je suis d'accord, je m'en tenais simplement à l'idée du PO sur ce que son code devrait faire.


Je pense que si je lis correctement la question d'OP, il vous manque une chose, il dit que si dans tout le tableau il n'y a pas de nombre pair, il devrait retourner null. cela ne signifie-t-il pas qu'au lieu de votre autre retournez null. vous devriez en définir un autre si en dehors de la boucle for. si evens = 0 renvoie null? car maintenant vous retournez également un null car il y a 1 nombre non pair alors qu'il y en a un dans le tableau


Oui @mrdeadsven, j'ajouterai ça.



0
votes

Voici la fonction correcte.

function getEvenAverage(tab) {
    var sum = 0, count = 0;
    for (var i = 0; i < tab.length; i++) {
      if (i % 2 === 0) {
        sum += parseInt(tab[i], 10);
        count++;
      }
    } 
    if(sum > 0)
      return (sum / count);
    return null;
}

Je vous souhaite un bon codage.


0 commentaires

0
votes

Essayez cette fonction,

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]))


1 commentaires

Vous obtenez un résultat erroné pour le dernier exemple de tableau. 0 est un nombre pair et la moyenne doit être 0.



0
votes

Vous n'avez besoin que des nombres pairs, donc d'abord filtre le tableau dans un nouveau tableau, puis additionne tous les nombres (en utilisant reduction ou une boucle for) et diviser par sa longueur.

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


0 commentaires

0
votes

En plus d'utiliser une boucle for, vous pouvez utiliser des méthodes de filtrage et de réduction de tableaux.

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]));


0 commentaires

2
votes

Vous pouvez également le faire avec le tableau réduire, avec un seul parcours de tableau

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]));


0 commentaires

0
votes
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

0 commentaires