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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

438閲覧

二次元配列を一定条件化でまとめたい

adk

総合スコア12

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2021/04/09 03:09

編集2021/04/09 03:12

ある二次元配列を使って下記の条件で別の二次元配列としたいです。

当初の二次元配列は要素[a,b,c,d]で構成されており、a~dのどれか1つにだけ値が入っており、他は""が入っている。

例えば
Youso=[ [5,"","",""] , [6,"","",""] , ["",7,"",""] , [5,"","",""]]とする。対応する要素名を
Youso=[[a1,b1,c1,d1] , [a2,b2,c2,d2] , [a3,b3,c3,d3] , [a4,b4,c4,d4]]とする。
これを
\\\\\\\\\\\\\\\\\\\\\\
条件1.各要素の""以外の数値を取り出す。ただし、同じ値がある場合は1回だけ取り出す。
例:aについて
aの""以外の数値はa1の5、a2の6、a4の5。a1とa4は同じ値なのでaの取り出す数値は5、6。
同様にしてbは7、cは数値なし、dは数値なし。
\\\\\\\\\\\\\\\\\\\\\\
条件2.各要素から取り出した数値の個数の最大値の数だけ一次配列を持つ新しい二次元配列NewYousoを作る。
そこに条件に応じて適切な値を入れる。     

 aで取り出した数値の個数は2個、bは1個、cは0個、dは0個なので各要素から取り出した数値の個数の最大値は
aで取り出した数値の個数、即ち2個となる。つまりNewYousoは2個の1次配列を含む2次配列とする。
つまりNewYousoは
NewYouso=[ [A1,B1,C1,D1],[A2,B2,C2,D2] ]
という形の2次配列とする。
A1にはaから取り出した1つ目の数値(a1の値:5)
A2にはaから取り出した2つ目の数値(a2の値:6)を入れる。

 B1にはbから取り出した1つ目の数値(b3の値:7)
B2にはbから取り出した2つ目の数値を入れるが、それは存在しないので""を入れる。
同様にC1、C2、D1、D2も対応する取り出した数字がないので""を入れる。
\\\\\\\\\\\\\\\\\\\\\\
最終的には
NewYouso=[[5,7,"",""],[6,"","",""]]
となる。

これをGoogle Apps Scriptで組みたいです。
やりたいことがうまく記述できていないですがアドバイスをよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

step.1 同じ値を消し込む。
step.2 前Indexが空きなら値を移す
step.3 全て空きのindexを削る(末尾から調べて)

という 3stepで考えるとシンプルなフローになるかなと。

GoogleAppScript

1 2//step.1 同じ値を消し込む 3for (var abcd = 0; abcd < 4; abcd++) { 4 var existChecker = {}; 5 for (var idx = 0; idx < Youso.length; idx++) { 6 if (Youso[idx][abcd] == "") continue; 7 if (existChecker[Youso[idx][abcd]]) { 8 Youso[idx][abcd] = ""; 9 } else { 10 existChecker[Youso[idx][abcd]] = "Exist Value"; 11 } 12 } 13} 14 15//step.2 前Indexが空きなら値を移す 16var hasMoveData = false; 17do { 18 hasMoveData = false; 19 for (var abcd = 0; abcd < 4; abcd++) { 20 for (var idx = Youso.length - 1; idx > 0; idx--) { 21 if (Youso[idx][abcd] == "") continue; 22 if (Youso[idx - 1][abcd] == "") { 23 Youso[idx - 1][abcd] = Youso[idx][abcd]; 24 Youso[idx][abcd] = ""; 25 hasMoveData = true; 26 } 27 } 28 } 29} while (hasMoveData); 30 31//step.3 全て空きのindexを削る(末尾から調べる) 32for (var idx = Youso.length - 1; idx >= 0; idx--) { 33 var sJoin = ""; 34 for (var abcd = 0; abcd < 4; abcd++) { 35 sJoin += Youso[idx][abcd]; 36 } 37 if (sJoin.length > 0) break; 38} 39Youso.length = idx + 1; 40

前回の散布図質問の続きでもあり、
乗りかけた舟という気分で応援したくなりましたけど
客観的には丸投げ質問を助長させてるのかと識者から怒られそうなところです。
もし次に行き詰って、ご質問にいたるときは、
コーディング上の疑問がご質問のキモになるよう努めてください。

投稿2021/04/09 05:18

FromMZ1500

総合スコア496

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

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

adk

2021/04/09 06:50

ありがとうございます。 自分でコードを組んでドツボにはまった末での質問ですが、 そのコードも出した方がよかったですね。 次回からは回答がコード関連に収束するよう気を付けて質問させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問