質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

767閲覧

jabascript 並び替え 入れ替え

yamamonssss

総合スコア3

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/27 06:19

イメージ説明

<script> var i,j; var XX=[["国語","英語","数学","合計","順位"], [30,65,55,0,0], [45,60,65,0,0], [50,65,65,0,0], [60,55,60,0,0], [70,45,50,0,0], [40,75,45,0,0], [50,45,90,0,0]]; </script>

上記のコードからスタートして、一回目の表示で合計を出し、二回目の表示で得点に番号をつけ昇順で並び替えをし、三回目では当てはめて元の配列に順位を乗せる画像のようなプログラムを作成したいです。すべてソートで計算をして表示という形です。できる方お願いします。説明があいまいで申し訳ございません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/11/27 06:26

jabascript の仕様を掲載しているWebはありますか。
guest

回答1

0

ベストアンサー

こんな感じですかね〜

javascript

1const XX = [ 2 ["国語","英語","数学","合計","順位"], 3 [30,65,55,0,0], 4 [45,60,65,0,0], 5 [50,65,65,0,0], 6 [60,55,60,0,0], 7 [70,45,50,0,0], 8 [40,75,45,0,0], 9 [50,45,90,0,0] 10]; 11 12XX.forEach((data, i) => { 13 if (i > 0) { 14 data[3] = data[0] + data[1] + data[2]; 15 } 16}); 17 18console.log(XX); 19 20const ranking = [0, ...XX.slice(1).map((data, i) => [i, data[3]]).sort((a, b) => b[1] - a[1]).map(([i]) => i+1)]; 21 22console.log(ranking); 23 24XX.forEach((data, i) => { 25 if (i > 0) { 26 data[4] = ranking.findIndex(j => j === i); 27 } 28}); 29 30console.log(XX); 31

???? 動作確認用サンプル @codepen

追記

質問の画像にも出てきますが、

0,7,3,4,2,5,6,1

という配列をどうやって作るか? がこの問題の考えどころのひとつです。
各データ行において、三科目の合計は、XXの各要素である配列のインデクス3の要素に入ってくるので、この値を比較するような比較関数をsortメソッドに与えてソートするわけですが、XXの最初の要素は

["国語","英語","数学","合計","順位"]

という、各データの名前の文字列を持つヘッダ情報なので、この行もソートの対象に含めてしまうと、"合計"という文字列と、他の行の合計値である数値とを比較することになるので、ひと工夫が必要です。
先の回答では、このひと工夫をしないで済むように、ヘッダ行をソート対象から除いていますが、かえって読みにくいコードになってしまっているかもしれません。
ヘッダ行(XXの先頭)もソート対象に含めつつ、

0,7,3,4,2,5,6,1

という配列、ranking を得るには、たとえば以下のようにします。

javascript

1const ranking = [...Array(XX.length)].map((_, i) => i).sort((i1, i2) => { 2 const [score1, score2] = [i1, i2].map(i => i > 0 ? XX[i][3] : Number.MAX_SAFE_INTEGER); 3 return score2 - score1; 4});

???? 動作確認用サンプル @codepen

これは、ソートで使う比較関数内においては、ヘッダ行にも合計の数値があるかのように見立てて、その値は Number.MAX_SAFE_INTEGER という非常に大きな数であると見なすというひと工夫によって、先頭要素もソート対象にしつつ、意図した結果を得るようにしています。

または、以下でも [0,7,3,4,2,5,6,1]の配列 rankingを作れます。

javascript

1const ranking = [...Array(XX.length)].map((_, i) => i).sort( 2 (i1, i2) => (i1 === 0 || i2 === 0) ? i1 - i2 : XX[i2][3] - XX[i1][3] 3);

???? 動作確認用サンプル @codepen

投稿2021/11/27 09:50

編集2021/11/27 12:38
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問