回答編集履歴
4
テキスト追加
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
テキスト追加
answer
CHANGED
@@ -43,7 +43,7 @@
|
|
43
43
|
0,7,3,4,2,5,6,1
|
44
44
|
```
|
45
45
|
という配列をどうやって作るか? がこの問題の考えどころのひとつです。
|
46
|
-
各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、こ
|
46
|
+
各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、この値を比較するような比較関数を`sort`メソッドに与えてソートするわけですが、`XX`の最初の要素は
|
47
47
|
```
|
48
48
|
["国語","英語","数学","合計","順位"]
|
49
49
|
```
|
2
テキスト追加
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
テキスト追加
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) という非常に大きな数である、と見なす、というひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。
|