回答編集履歴

1

ランク値設定方法を追記

2022/05/15 06:31

投稿

k.a_teratail
k.a_teratail

スコア845

test CHANGED
@@ -4,16 +4,93 @@
4
4
  ```
5
5
 
6
6
  script側でID取得を行い、テーブルの各セルに生徒5人分の設定を行う
7
+
8
+ ランク処理の方法を追記
9
+
7
10
  ```js
11
+ // Scoreクラスのコンストラクタに「index」を追加
12
+ class Score { //クラスの指定
13
+ constructor(total, name, NL, math, science, society, english, index) {
14
+
15
+ ・・・省略・・・
16
+ this._english = english;
17
+ // ランク変数
18
+ this._rank = 0;
19
+ // 固有番号値
20
+ this._index = index;
21
+ }
22
+ ・・・省略・・・
23
+ get total() { return this._NL + this._math + this._science + this._society + this._english; }
24
+ // ランクのセッター、ゲッター
25
+ set rank(rank) { this._rank = rank; }
26
+ get rank() { return this._rank; }
27
+ // 固有番号のゲッター
28
+ get index() { return this._index; }
29
+ }
30
+
31
+ // クラス引数の最後に固有番号を追加
8
- let listTable = document.getElementById('list');
32
+ const a = new Score(this.total, 'Aさん', 80, 70, 70, 50, 60, 1);
33
+ const b = new Score(this.total, 'Bさん', 60, 70, 40, 80, 60, 2);
34
+ const c = new Score(this.total, 'Cさん', 70, 70, 70, 60, 60, 3);
35
+ const d = new Score(this.total, 'Dさん', 80, 40, 40, 70, 70, 4);
36
+ const e = new Score(this.total, 'Eさん', 70, 70, 70, 60, 70, 5);
37
+
38
+ // 固有番号をキーに固有番号対応クラスと合計値を設定
39
+ let arr = {
40
+ [a.index]: [a, a.total],
41
+ [b.index]: [b, b.total],
42
+ [c.index]: [c, c.total],
43
+ [d.index]: [d, d.total],
44
+ [e.index]: [e, e.total]
45
+ };
46
+
47
+ // 合計値を降順で並び替える
48
+ let obj = Object.keys(arr).map((e) => ({key: e, value: arr[e][1]}));
49
+ obj.sort((a, b) => {
50
+ if (a.value < b.value) return 1;
51
+ if (a.value > b.value) return -1;
52
+ return 0;
53
+ });
54
+
55
+ // ランク値
56
+ let rankNum = 1;
57
+ // ランク重み値
58
+ let rankNumWeight = 0;
59
+ // 作業用合計値
60
+ let tmpTotal = obj[0].value;
61
+ // 一番点数が大きいものランクを設定
62
+ arr[obj[0].key][0]._rank = rankNum;
63
+
64
+ for (let i = 1; i < obj.length; i++) {
65
+ let index = obj[i].key;
66
+
67
+ // トータル点数が同じ場合はランク値を加算しない
68
+ if (obj[i].value == tmpTotal) {
69
+ arr[index][0]._rank = rankNum;
70
+ // ランク重み値を加算
71
+ rankNumWeight++;
72
+ } else {
73
+ // ランク値に重みを加算
74
+ rankNum += rankNumWeight + 1;
75
+ arr[index][0]._rank = rankNum;
76
+
77
+ // ランク重み値をリセット
78
+ rankNumWeight = 0;
79
+ // 作業用合計値を更新
80
+ tmpTotal = obj[i].value;
81
+ }
82
+ }
83
+
9
84
 
10
85
  // 生徒リスト
11
86
  const studentArr = [
12
87
  a, b, c, d, e
13
88
  ];
14
89
 
90
+ let listTable = document.getElementById('list');
91
+
15
92
  // 生徒リスト分繰り返す
16
- studentArr.forEach(function(value) {
93
+ studentArr.forEach(function (value) {
17
94
  // テーブルの末尾に1行追加
18
95
  let rows = listTable.insertRow(-1);
19
96
  // 追加した行のセルに値をセット
@@ -24,7 +101,9 @@
24
101
  rows.insertCell(-1).innerHTML = value.society;
25
102
  rows.insertCell(-1).innerHTML = value.english;
26
103
  rows.insertCell(-1).innerHTML = value.total;
104
+ rows.insertCell(-1).innerHTML = value.rank;
27
105
  });
106
+
28
107
  ```
29
108
 
30
109
  このような感じでどうでしょうか?