2017-02-18 137 views
-1

我有一个二维数组,按照学生的姓名和他们各种100米冲刺课程排序。数据阵列的一个片段可能看起来像这样...多维数组中的Javascript平均值

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语句失败。

无法从undefined读取属性“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; 
     } 
    } 
    } 
+6

哪里是你的阵列? –

回答

1

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

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

+0

非常感谢你的完美演绎,尽管我一直在摸索着每一行的含义。我本来无法自己想出这个。 – user1488934

+0

请原谅我的无知,但我该如何从“结果”,一个对象表(?)表,到一个像“studentList”这样的普通数组?所以我可以将数据写回电子表格。谢谢。 – user1488934

+0

您可以使用['Array#map'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)并将值呈现给数组。 –