【问题标题】:find the average of both arrays, and then spit out the greater of the two求两个数组的平均值,然后吐出两者中较大的一个
【发布时间】:2014-09-25 05:18:00
【问题描述】:

每当我运行它时,它都会给我“第一”而不是“第二”。我的逻辑在这里正确吗?找到两个平均值然后返回更大的值?或者你认为它到底有什么问题。

var first = ([100, 80], [100, 100]);
function compare(a, b) {
  sum = 0;
  for(var i = 0; i < a.length; i++) {
    sum += first[i];
    avg1 = (sum/a.length);
  }

  sum2 = 0;
  for(i = 0; i < b.length; i++) {
    sum2 += first[i];
    avg2 = (sum2/b.length);
  }
  if (avg1 > avg2); {
    return ("first");
  }
  if (false) {
    return ("second");
  }
}

【问题讨论】:

  • “我的逻辑在这里正确吗?”如果你没有得到你期望的结果,那么你的逻辑可能不正确。
  • 函数的参数是什么?为什么要在两个循环中对同一个数组求和?
  • var first = ( [100,80], [100,100]);的意义何在?逗号操作符返回它的第二个参数,所以这相当于var first = ( [100,100]);
  • len 在哪里定义?您发布的代码似乎不完整,因此我们将无法运行它。
  • if (false) 永远不会执行它的主体。那应该是一个else 子句。

标签: javascript


【解决方案1】:

如果你想得到ab 中元素的平均值,你需要对这些元素求和,而不是first 的元素。

此外,if (avg1 &gt; avg2) 之后还有一个额外的 ;,它为该条件创建了一个空主体,因此 return "first" 被无条件执行。

function compare(a,b) {
    var sum = 0;
    for(var i=0; i<a.length;i++) {
        sum += a[i];
        var avg1 = (sum/a.length);
    }

    var sum2 = 0;
    for(i=0;i<b.length;i++) {
        sum2 += b[i];
        var avg2 = (sum2/b.length);
    }
    if (avg1 > avg2) {
        return "first";
    } else {
        return "second";
    }
}
alert(compare([80, 100], [100, 100]));
alert(compare([100, 150, 200], [50, 75, 100, 110]));

【讨论】:

  • 我知道你主要是复制代码,但仍然:不要忘记局部变量,平均值的计算可以移到循环之外。
  • 谢谢,没有注意到他遗漏了一些var 声明。
【解决方案2】:

有一个更简单的方法来做到这一点......

首先,查看my answer on this question,了解如何在 JavaScript 中找到一组数字的平均值。

var average = myArray.reduce(function(a, b) {
    return a + b;
})/myArray.length;

您可以对两个数组都执行此操作,并使用Math.max() 返回两者中较大的平均值。整个函数如下所示:

var greaterAverage = function (arr1, arr2) {
    return Math.max( arr1.reduce(function(a, b) {
        return a + b;
    }) / arr1.length, arr2.reduce(function(a, b) {
        return a + b;
    }) / arr2.length );
}

如果你想返回原始数组或类似“first”的东西,那么你只需比较平均值:

var greaterAverage = function (arr1, arr2) {
    var avg1 = arr1.reduce(function(a, b) {
        return a + b;
    }) / arr1.length;

    var avg2 = arr2.reduce(function(a, b) {
        return a + b;
    }) / arr2.length;

    if (avg1 < avg2) {
        return avg1; // or return "first";
    } else if (avg1 > avg2) {
        return avg2; // or return "second";
    }
}

【讨论】:

    【解决方案3】:

    一个更简单的方法是明确定义平均值。

    数组的平均值是其组成部分的总和除以其长度。我留下这个是为了在 0 长度数组上抛出一个错误,因为根据数学,空数组的平均值是无意义的,但有些人会对此有所警惕并返回零。

    要对成分求和,请通过添加成员来减少数组。

    var First  = [1,2,3],
        Second = [3,4,5];
    
    function avg(A) {
        var Total = A.reduce( function(L,R) { return L+R; } );
        return Total / A.length;
    }
    
    window.alert( (avg(First) > avg(Second))? 'First' : 'Second' );

    【讨论】:

      【解决方案4】:

      首先你的if else 语法是错误的。 if else 语法是

      if (condition) {
          block of code to be executed if the condition is true
      } else { 
          block of code to be executed if the condition is false
      }
      

      例子

      如果时间小于 20:00,则创建“Good day”问候语,否则创建“晚安”:

      if (time < 20) {
          greeting = "Good day";
      } else {
          greeting = "Good evening";
      }
      

      输出:美好的一天。

      用更正的代码Corrected code检查这个jsfiddle链接

      【讨论】:

        猜你喜欢
        • 2017-02-21
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多