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'); } }
7 Réponses :
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]));
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.
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.
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]))
Vous obtenez un résultat erroné pour le dernier exemple de tableau. 0 est un nombre pair et la moyenne doit être 0.
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
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]));
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]));
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
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ôtlet
! (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 :)