【问题标题】:Javascript - simple exercisesJavascript - 简单的练习
【发布时间】:2019-04-24 06:52:22
【问题描述】:

我的任务是编写一个函数getEvenAverage,它应该只接受一个参数 - 数组。这个函数应该return这个数组中偶数的平均值。如果数组中没有任何偶数,则函数应返回null

非常感谢任何反馈 :-)

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

【问题讨论】:

  • 你的函数没有返回任何东西
  • 我认为您的示例中缺少某些内容?大括号太多({})
  • 不要使用var,而是使用let! (它会直接向您显示您犯的一些错误)
  • @emil 一些额外的块语句确实令人困惑,但它们不会改变代码的工作方式:)

标签: javascript arrays function math


【解决方案1】:

你说你需要退货,所以return它。还将您的 if 语句移动到您的 for 循环中,并修复一些其他语法错误。正如 cmets 中所指出的,您应该将sum 除以偶数个数,得到您的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]));

【讨论】:

  • 我认为你不应该根据 tab.length 划分,而是根据有多少个偶数来划分
  • 哦,是的,我的坏@giorgim。
  • 现在修复了@giorgim,好点了吗?
  • 我同意,我只是坚持 OP 关于他们的代码应该做什么的想法。
  • 是的@mrdeadsven,我会补充的。
【解决方案2】:

你也可以用数组reduce来做,用一个数组遍历

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

【讨论】:

    【解决方案3】:

    这是正确的函数。

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

    祝你编码愉快。

    【讨论】:

      【解决方案4】:

      除了使用 for 循环,您还可以使用 filter 和 reduce Array 方法。

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

      【讨论】:

        【解决方案5】:

        试试这个功能,

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

        【讨论】:

        • 最后一个示例数组的结果错误。 0 为偶数,平均值应为 0。
        【解决方案6】:

        您只需要偶数,因此首先将数组filter 放入一个新数组,然后将所有数字相加(使用reduce 或for 循环)并除以它的长度。

        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

        【讨论】:

          【解决方案7】:
          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-24
            • 1970-01-01
            • 2013-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多