
Google Apps Scriptを勉強中の者です。
例えば成績処理のようなことをする場合に成績の順位を出すような処理が必要です。二次元配列をsortで降順に並び替えるのは簡単ですが、順位を出す場合は、同点の場合は同順位になりますが、それを二次元配列を使ってするにはどうしたらいいのでしょうか?indexOfでは同順位の処理はできないですよね?
例えば以下のように同点の者が複数いる場合の処理方法がわかりません。
生徒 点数 順位
A 85 1
B 82 2
C 82 2
D 82 2
E 80 5
F 78 6
G 78 6
H 76 8
I 71 9
J 70 10
VBAだとworksheetfunction.rankという形でVBAの関数を使えますが、GASでもそういうことはできるのでしょうか?
ネットで検索してもわからないので、解決法を教えていただければ助かります。どうぞよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
配列の並べ替えができたのならば、あとは順位を付け足しましょう
var 比較 = (a,b) => a.点数 - b.点数;
配列.sort( 比較 );
for (var i=0; i<配列.length; i++) {
_ var 順位 = i+1;
_ if (0 < i && 比較(配列[i-1], 配列[i]) == 0) {
_ _ 順位 = 配列[i-1].順位;
_ }
_ 配列[i].順位 = 順位;
}
var Dの順位 = 配列.find(e => e.生徒 == "D").順位 // == 2
var Eの順位 = 配列.find(e => e.生徒 == "E").順位 // == 5
早速の回答ありがとうございます。新年度の準備でバタバタしていて返信遅れてすみません。
お示しいただいた方法がまだよく理解できないのですが、調べてみたいと思います。もしこういった順位の出し方を解説しているようなサイトがあれば教えていただければ助かります。ソートについてはたくさん解説サイトがあるのですが、順位については見つけられませんでした。
No.4
- 回答日時:
const data = [
['H',76],
['B',82],
['A',85],
['E',80],
['I',71],
['J',70],
['C',82],
['F',78],
['G',78],
['D',82],
];
const output = data.sort((a,b)=>b[1]-a[1])
.reduce((p,c,i)=>{
const rank = (i > 1 && p[p.length - 1][1] === c[1]) ? p[p.length - 1][2] : i + 1;
c.push(rank);
p.push(c);
return p;
}, []);
console.log(output);
reduceについては、以下が参考になります。
https://developer.mozilla.org/ja/docs/Web/JavaSc …
忙しい中、回答ありがとうございます。
お示しいただいたコードで順位がちゃんとだせることを確認いたしました。ちょっとどのように処理しているかが、今はわからないので、勉強したいと思います。
reduceというメソッドは知ってはいましたが、使ったこともなく何のためにあるかもよくわかっていませんでした。お示しいただいたサイトを見たのですが、私にはよく理解できませんでした。(~_~;)
また質問することがあるかもしれませんが、よろしくお願いいたします。m(__)m
No.3
- 回答日時:
No2です。
>配列で処理できないかと考えているところです。
それに該当する回答がNo1様の回答です。(=No2にも書きました)
>ソートについてはたくさん解説サイトがあるのですが、
>順位については見つけられませんでした。
ソートに関しては、先人達の成果がいくつかの代表的なロジックとしてまとめられています。
一目でその内容が理解できれば良いのですが、そうでもないので、解説サイトがいろいろあるのでしょう。
また、複数のロジックがどう違うのかも、解説が欲しくなったりしますよね。
(javascriptの場合は、sortメソッドが用意されているので、ロジックを知る必要もないですけれど)
これに対して、「順位付け」は特に解説するほどの内容がないので、解説サイトがないだけではないでしょうか?
(机上作業で、ソートされていれば順位付けに苦労する人はいないでしょう)
自前で処理するのなら、ソート済みの配列を順に見て行って、
「一つ前と値が同じなら、一つ前と同じ順位、そうでなければ配列の添え字(=単独の場合の順位と同じ)を順位とする」
というロジックで一巡すれば良いだけですから。
(机上やシート上で作業列に順位を出すのと、考え方は全く同じです)
※ 配列の添え字が0始まりの場合は、順位は「添え字+1」と考える
(序数は1始まりなので)
※ 配列の最初の値を処理する際、「その一つ前」が存在しないので、無条件で順位1とする
あたりに注意しておく必要はありますが。
再度の回答ありがとうございます。
いろいろなサイトを見て、なんとかNo.1のOgre7077様の書いていることがなんとなく理解できました。
とりあえずは、自分のやりたいと思っていた配列を使って順位を出すことはできたのですが、まだまだ勉強しないといけないことを痛感しました。ありがとうございました。
No.2
- 回答日時:
こんにちは
計算で行う方法は、既にNo1様の回答にある通りと思いますが・・
>VBAだとworksheetfunction.rankという形でVBAの関数を使えますが、~
それは、VBAというよりはエクセルのシート関数のことですよね?
スプレッドシートなら、同様にシートで関数を利用すれば、同じことは可能でしょう。
https://support.google.com/docs/answer/3094098?s …
GASの場合は、WorksheetFunction のようにスクリプト内でシート関数を呼び出す仕組みはないようですので、シート上で処理する必要がありますけれど。
丁度、逆に、
>二次元配列をsortで降順に並び替えるのは簡単ですが~
VBAの場合はSORTメソッドのような機能がないので、自作で並べ替え計算をするか、シート上で並べ替え機能を利用するかになるのと同様(=逆ですが)のことと思います。
早速の回答ありがとうございます。GASではスクリプト内でシート関数を呼び出すことはできないこと、理解いたしました。
GAS内でできないのであれば、作業列みたいなものを作って、そこに関数を入れて計算して、それを配列に入れて処理しようと考えたのですが、人数が多いとタイムリミットの6分を超えそうなので、配列で処理できないかと考えているところです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP 【スプレッドシート】順位のつけ方 2 2022/08/17 13:27
- 統計学 テストの順位についてです 今回のテストの順位を知りたいのですが、できますでしょうか?今回は僕の学年は 4 2022/11/30 19:15
- 数学 順序集合における「反射律」の役割について 9 2022/05/09 23:01
- Java Java 南京錠 2 2023/02/04 11:46
- 弁護士・行政書士・司法書士・社会保険労務士 民法改正後の弁済の充当について 1 2022/05/21 20:18
- Java javaについて 1 2023/12/06 20:08
- その他(悩み相談・人生相談) 僕は中二です 将来のことについて質問です 先ず、僕の通っている学校は、県全体で見たときに中の下くらい 4 2022/08/09 14:12
- 大学・短大 (工学部)成績について 3 2022/09/07 14:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#テキストボックスの文字を配...
-
同じIDで定義した要素の配列を...
-
javascript 変数名の連結をしたい
-
複数のフィードの読み込みが日...
-
("Scripting.Dictionary")につ...
-
jspからjavascriptの変数引継ぎ
-
順列生成アルゴリズムについて...
-
JavaScriptで簡単なクイズを作...
-
WSH(Jscript)でファイル一覧
-
二次元配列の全要素の全要素を...
-
配列の1要素を代入した変数を使...
-
textareaに入力されたデータを...
-
二次元配列を使って順位をだす...
-
Ajax:getElementsByTagNameで...
-
javascriptの2次元配列をソート...
-
JavaScript window.openで開く...
-
functionから別のfunctionを実...
-
○歳△ヶ月と×日を計算してくれる...
-
JavaScriptで文字列の特定文字...
-
jslintのエラーについて質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
1から20までの整数から、重複な...
-
空の配列に2次元配列の追加
-
二次元配列を使って順位をだす...
-
C#テキストボックスの文字を配...
-
javascriptからURLパラメータ値...
-
undefinedを表示させない方法は...
-
JavaScriptにおける[] とか :...
-
javascriptで行を抽出したいです。
-
javascriptで2つのArrayの...
-
textareaに入力されたデータを...
-
二次元配列の全要素の全要素を...
-
配列を作って総当たりで距離を...
-
[JS] setAttributeで保存される...
-
順列生成アルゴリズムについて...
-
ソートで
-
重複のない乱数の表示をするには?
-
javascriptで配列の重複判定の...
おすすめ情報