【问题标题】:javascript applying function to different arraysjavascript将函数应用于不同的数组
【发布时间】:2021-04-14 11:42:33
【问题描述】:

我想要达到的目标:

  1. 计算带有分数的数组的平均分数的函数。
  2. 使函数可重复用于不同的数组

目前已实现:

const grades = [9, 8, 5, 7, 7, 4, 9, 8, 8, 3, 6, 8, 5, 6];
function classAverage () {
    let sumOfGrades = 0;
    for(let i = 0; i < (grades.length); i++) {
        sumOfGrades += grades[i];

    }
    const averageGrade = sumOfGrades/(grades.length);
    return averageGrade;
}
classAverage(grades);
console.log(averageGrade);

这似乎在我的 ide 中有效,在这里它会产生一个错误 averageGrade not defined。 接下来我希望这个函数可以应用于更多的数组,比如 Grades1999 或 Grades2021 但是函数内部的 for 循环使用 Grades 数组进行计算,我怎样才能实现这个函数可以使用类似:classAverage Grades(2019 ) 具有不同名称的数组。

感谢您的宝贵时间!

【问题讨论】:

  • 你永远不会使用移交的数组。而是使用全局 grades 数组。
  • const averageGrade 是在函数内部声明的,所以它只能在这个函数内部使用。你也用classAverage(grades) 调用它,你传递了一些东西(等级),但是这个函数不接受任何参数,所以这是没用的。
  • 另外,你需要使用函数返回的值返回const average = classAverage(grades);
  • 你实际上需要两个函数sum(array)返回一个数组的总和,avg(array)使用sum计算平均值。这两个函数都不应使用classgrades 和其他特定于问题的术语。
  • 感谢大家的贡献!这真的帮助我提高了我的技能。

标签: javascript arrays function


【解决方案1】:

函数内部的数组需要一个参数来计算不同的数组。

因此,您需要对返回值进行赋值或直接使用它而不存储结果。

然后您可以直接使用for ... of statement 获取值。

一些提示:

function classAverage (grades) {
    let sumOfGrades = 0;
    for(const grade of grades) {
        sumOfGrades += grade;
    }
    return sumOfGrades/grades.length;
}

console.log(classAverage([9, 8, 5, 7, 7, 4, 9, 8, 8, 3, 6, 8, 5, 6]));

【讨论】:

    【解决方案2】:

    查看其他 cmets 了解您的代码失败的原因。

    为此做了减少

    const numArrayAverage = arr => arr.reduce((a,b)=>a+b)/arr.length;
    
    console.log(numArrayAverage([9, 8, 5, 7, 7, 4, 9, 8, 8, 3, 6, 8, 5, 6]));

    有输入测试

    const numArrayAverage = arr => Array.isArray(arr) && arr.length > 0 ?  arr.reduce((a,b)=>a+b)/arr.length : "Invalid input";
    
    console.log(numArrayAverage ([9, 8, 5, 7, 7, 4, 9, 8, 8, 3, 6, 8, 5, 6]));
    console.log(numArrayAverage ([]));

    【讨论】:

    • 应该是 .reduce((a,b)=&gt;a+b, 0) 以使其适用于空数组
    • @georg 添加了带有输入测试的版本
    • 我不确定这是否更好。空数组的平均值不为 0。
    • 好的,改成返回无效输入并重命名函数
    【解决方案3】:

    只需对你所拥有的进行一些调整,它应该可以正常运行

    const gradesData = [9, 8, 5, 7, 7, 4, 9, 8, 8, 3, 6, 8, 5, 6];
    
    function classAverage(grades) {
      let sumOfGrades = 0;
    
      for (let i = 0; i < (grades.length); i++) {
        sumOfGrades += grades[i];
      }
    
      const averageGrade = sumOfGrades / (grades.length);
      return averageGrade;
    }
    
    console.log(classAverage(gradesData));

    【讨论】:

    • 我给你做了一个sn-p并添加了一个console.log来查看结果
    【解决方案4】:

    您可以在Array.prototype 中添加一个方法(classAverage),然后用不同的等级数组调用它。

    Array.prototype.classAverage = function () {
      return this.reduce((r, g) => r + g, 0) / (this.length || 1);
    };
    
    const grades = [9, 8, 5, 7, 7, 4, 9, 8, 8, 3, 6, 8, 5, 6];
    const grades1999 = [1, 8, 3, 5, 7, 2, 4, 3];
    const grades2020 = [5, 6, 7, 8, 2, 3, 4, 5, 6, 7, 8];
    const grades2023 = [];
    
    console.log(grades.classAverage());
    console.log(grades1999.classAverage());
    console.log(grades2020.classAverage());
    console.log(grades2023.classAverage());

    【讨论】:

    • 是什么让你认为空数组的平均值为 0?也可以是 42。
    • 1.不要碰原型。 2. 否则代码identical to mine 半小时前发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多