【问题标题】:Javascript average within multidimension array多维数组中的 Javascript 平均值
【发布时间】:2017-02-18 13:10:49
【问题描述】:

我有一个 2D 数组,按学生姓名和他们的各种 100m 冲刺会话排序。数据数组的一个 sn-p 可能看起来像这样......

Names                 Time(s)

ANDREWMICHEALSMITH    13.95
JOHNJAMESPETERSON     13.70
JOHNJAMESPETERSON     13.80
JOHNJAMESPETERSON     12.50
PETERMICHEALHEWITT    12.80
PETERMICHEALHEWITT    12.60
VICENTJAMESSMITH      13.10
VICENTJAMESSMITH      13.50
VICENTJAMESSMITH      13.80
VICENTJAMESSMITH      13.00

我迫切需要转换表格以显示学生姓名、他们的平均时间和定时会话数,如下所示的理想结果......

Names                 Avg Time(s) Sessions

ANDREWMICHEALSMITH    13.95       1
JOHNJAMESPETERSON     13.33       3
PETERMICHEALHEWITT    12.70       2
VICENTJAMESSMITH      13.35       4

到目前为止,我已经起草了一个 JavaScript 代码,不幸的是在第一个 if 语句中失败了。

无法从未定义中读取属性“0”。

该代码也没有捕获具有第 n 个会话数的学生,并且还没有提供会话数。坦率地说,对于手头的任务,我的 Java 知识非常有限。我迫切需要一些帮助才能达到最终结果。

我非常感谢任何指导。

  StudentList.sort();

  for (var i=0; i<StudentList.length; i++){

    if(StudentList[i][0] == StudentList[i+1][0]){
      if(StudentList[i+1][0] == StudentList[i+2][0]){
        if(StudentList[i+2][0] == StudentList[i+3][0]){
          if(StudentList[i+3][0] == StudentList[i+4][0]){
            StudentList[i][1] = (StudentList[i][1]+StudentList[i+1][1]+StudentList[i+2][1]+StudentList[i+3][1]+StudentList[i+4][1])/5;
            StudentList.splice(i+1,3);
          }else{           
            StudentList[i][1] = (StudentList[i][1]+StudentList[i+1][1]+StudentList[i+2][1]+StudentList[i+3][1])/4;
          }
        }else{
          StudentList[i][1] = (StudentList[i][1]+StudentList[i+1][1]+StudentList[i+2][1])/3;
        }
      }else{
        StudentList[i][1] = (StudentList[i][1]+StudentList[i+1][1])/2;
      }
    }
  }

【问题讨论】:

  • 你的阵列在哪里?

标签: javascript multidimensional-array average


【解决方案1】:

您可以使用对象作为名称的哈希表,使用 ean 数组作为结果集来计算和存储数据。

var studentList = [['ANDREWMICHEALSMITH', 13.95], ['VICENTJAMESSMITH', 13.00], ['PETERMICHEALHEWITT', 12.80], ['PETERMICHEALHEWITT', 12.60], ['VICENTJAMESSMITH', 13.10], ['JOHNJAMESPETERSON', 13.70], ['JOHNJAMESPETERSON', 12.50], ['VICENTJAMESSMITH', 13.50], ['JOHNJAMESPETERSON', 13.80], ['VICENTJAMESSMITH', 13.80]],
    hash = Object.create(null),
    result = [],
    array;

studentList.forEach(function (a) {
    if (!hash[a[0]]) {
        hash[a[0]] = { name: a[0], sum: 0, count: 0, avg: 0 };
        result.push(hash[a[0]]);
    }
    hash[a[0]].sum += a[1];
    hash[a[0]].count++;
    hash[a[0]].avg = (hash[a[0]].sum / hash[a[0]].count).toFixed(2);
});

array = result.map(function (a) {
    return [a.name, a.avg, a.count];
});

console.log(array);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 非常感谢,这一切都很好,尽管我还在摸索每一行的含义。我自己永远也想不出这个。
  • 请原谅我的无知,但是我如何从“结果”,一个对象表(?),到一个像“studentList”这样的普通数组呢?所以我可以将数据写回电子表格。谢谢。
  • 您可以使用Array#map 并将值呈现到数组中。
  • 面向对象的数组、属性和方法的整个想法对我来说都是全新的,我很难吸收所有这些。但是,我开始了解您的代码是如何工作的。对于看似最小的代码来说是如此强大。仍在努力了解如何根据您的建议使用 array.map() 来取回对象数组,因此我将其写入电子表格。最终我需要执行 TargetSS.setValues(result);.
  • 我的错,我已经看到你用 map() 方法更新的代码,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多