teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

テキスト追加

2021/11/27 12:38

投稿

退会済みユーザー
answer CHANGED
@@ -63,4 +63,13 @@
63
63
  ```
64
64
  ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/ZEXzEeO?editors=0012) @codepen
65
65
 
66
- これは、ソートで使う比較関数内においては、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数であると見なすというひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。
66
+ これは、ソートで使う比較関数内においては、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数であると見なすというひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。
67
+
68
+ または、以下でも [0,7,3,4,2,5,6,1]の配列 `ranking`を作れます。
69
+
70
+ ```javascript
71
+ const ranking = [...Array(XX.length)].map((_, i) => i).sort(
72
+ (i1, i2) => (i1 === 0 || i2 === 0) ? i1 - i2 : XX[i2][3] - XX[i1][3]
73
+ );
74
+ ```
75
+ ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/oNGvgVg?editors=0012) @codepen

3

テキスト追加

2021/11/27 12:38

投稿

退会済みユーザー
answer CHANGED
@@ -43,7 +43,7 @@
43
43
  0,7,3,4,2,5,6,1
44
44
  ```
45
45
  という配列をどうやって作るか? がこの問題の考えどころのひとつです。
46
- 各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、こをソートキーてソートするわけですが、`XX`の最初の要素は
46
+ 各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、この値比較するような比較関数を`sort`メッド与えてソートするわけですが、`XX`の最初の要素は
47
47
  ```
48
48
  ["国語","英語","数学","合計","順位"]
49
49
  ```

2

テキスト追加

2021/11/27 11:27

投稿

退会済みユーザー
answer CHANGED
@@ -63,4 +63,4 @@
63
63
  ```
64
64
  ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/ZEXzEeO?editors=0012) @codepen
65
65
 
66
- これは、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数であると見なすというひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。
66
+ これは、ソートで使う比較関数内においては、ヘッダ行にも合計の数値があるかのように見立てて、その値は [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

投稿

退会済みユーザー
answer CHANGED
@@ -33,4 +33,34 @@
33
33
  console.log(XX);
34
34
 
35
35
  ```
36
- ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/VwMZZXb?editors=0012) @codepen
36
+ ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/VwMZZXb?editors=0012) @codepen
37
+
38
+
39
+ ### 追記
40
+
41
+ 質問の画像にも出てきますが、
42
+ ```
43
+ 0,7,3,4,2,5,6,1
44
+ ```
45
+ という配列をどうやって作るか? がこの問題の考えどころのひとつです。
46
+ 各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、これをソートキーにしてソートするわけですが、`XX`の最初の要素は
47
+ ```
48
+ ["国語","英語","数学","合計","順位"]
49
+ ```
50
+ という、各データの名前の文字列を持つヘッダ情報なので、この行もソートの対象に含めてしまうと、"合計"という文字列と、他の行の合計値である数値とを比較することになるので、ひと工夫が必要です。
51
+ 先の回答では、このひと工夫をしないで済むように、ヘッダ行をソート対象から除いていますが、かえって読みにくいコードになってしまっているかもしれません。
52
+ ヘッダ行(XXの先頭)もソート対象に含めつつ、
53
+ ```
54
+ 0,7,3,4,2,5,6,1
55
+ ```
56
+ という配列、`ranking` を得るには、たとえば以下のようにします。
57
+
58
+ ```javascript
59
+ const ranking = [...Array(XX.length)].map((_, i) => i).sort((i1, i2) => {
60
+ const [score1, score2] = [i1, i2].map(i => i > 0 ? XX[i][3] : Number.MAX_SAFE_INTEGER);
61
+ return score2 - score1;
62
+ });
63
+ ```
64
+ ???? [動作確認用サンプル](https://codepen.io/kilesa/pen/ZEXzEeO?editors=0012) @codepen
65
+
66
+ これは、ヘッダ行にも合計の数値があるかのように見立てて、その値は [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) という非常に大きな数である、と見なす、というひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。