2017-02-18 19 views
-1

私は学生の名前とそのさまざまな100mスプリントセッションでソートされた2D配列を持っています。データ配列のスニペットは、このように見えるかもしれません...多次元配列内の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文で残念ながら失敗しました。

未定義からプロパティ "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

私の無知を赦してください。しかし、 "result"、オブジェクトのテーブル(?)から、 "studentList"のような普通の配列にどうやって行くのですか?だから私はスプレッドシートにデータを書き戻すことができます。ありがとうございました。 – user1488934

+0

['Array#map'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)を使用して値を配列にレンダリングすることができます。 –