回答編集履歴

4

テキスト追加

2021/11/27 12:38

投稿

退会済みユーザー
test CHANGED
@@ -129,3 +129,21 @@
129
129
 
130
130
 
131
131
  これは、ソートで使う比較関数内においては、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数であると見なすというひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。
132
+
133
+
134
+
135
+ または、以下でも [0,7,3,4,2,5,6,1]の配列 `ranking`を作れます。
136
+
137
+
138
+
139
+ ```javascript
140
+
141
+ const ranking = [...Array(XX.length)].map((_, i) => i).sort(
142
+
143
+ (i1, i2) => (i1 === 0 || i2 === 0) ? i1 - i2 : XX[i2][3] - XX[i1][3]
144
+
145
+ );
146
+
147
+ ```
148
+
149
+ ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/oNGvgVg?editors=0012) @codepen

3

テキスト追加

2021/11/27 12:38

投稿

退会済みユーザー
test CHANGED
@@ -88,7 +88,7 @@
88
88
 
89
89
  という配列をどうやって作るか? がこの問題の考えどころのひとつです。
90
90
 
91
- 各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、こをソートキーてソートするわけですが、`XX`の最初の要素は
91
+ 各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、この値比較するような比較関数を`sort`メッド与えてソートするわけですが、`XX`の最初の要素は
92
92
 
93
93
  ```
94
94
 

2

テキスト追加

2021/11/27 11:27

投稿

退会済みユーザー
test CHANGED
@@ -128,4 +128,4 @@
128
128
 
129
129
 
130
130
 
131
- これは、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数であると見なすというひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。
131
+ これは、ソートで使う比較関数内においては、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数であると見なすというひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。

1

テキスト追加

2021/11/27 11:09

投稿

退会済みユーザー
test CHANGED
@@ -69,3 +69,63 @@
69
69
  ```
70
70
 
71
71
  ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/VwMZZXb?editors=0012) @codepen
72
+
73
+
74
+
75
+
76
+
77
+ ### 追記
78
+
79
+
80
+
81
+ 質問の画像にも出てきますが、
82
+
83
+ ```
84
+
85
+ 0,7,3,4,2,5,6,1
86
+
87
+ ```
88
+
89
+ という配列をどうやって作るか? がこの問題の考えどころのひとつです。
90
+
91
+ 各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、これをソートキーにしてソートするわけですが、`XX`の最初の要素は
92
+
93
+ ```
94
+
95
+ ["国語","英語","数学","合計","順位"]
96
+
97
+ ```
98
+
99
+ という、各データの名前の文字列を持つヘッダ情報なので、この行もソートの対象に含めてしまうと、"合計"という文字列と、他の行の合計値である数値とを比較することになるので、ひと工夫が必要です。
100
+
101
+ 先の回答では、このひと工夫をしないで済むように、ヘッダ行をソート対象から除いていますが、かえって読みにくいコードになってしまっているかもしれません。
102
+
103
+ ヘッダ行(XXの先頭)もソート対象に含めつつ、
104
+
105
+ ```
106
+
107
+ 0,7,3,4,2,5,6,1
108
+
109
+ ```
110
+
111
+ という配列、`ranking` を得るには、たとえば以下のようにします。
112
+
113
+
114
+
115
+ ```javascript
116
+
117
+ const ranking = [...Array(XX.length)].map((_, i) => i).sort((i1, i2) => {
118
+
119
+ const [score1, score2] = [i1, i2].map(i => i > 0 ? XX[i][3] : Number.MAX_SAFE_INTEGER);
120
+
121
+ return score2 - score1;
122
+
123
+ });
124
+
125
+ ```
126
+
127
+ ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/ZEXzEeO?editors=0012) @codepen
128
+
129
+
130
+
131
+ これは、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数である、と見なす、というひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。