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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

804閲覧

Javascript if else 文を短縮し処理を軽くしたい

rate_o

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

6クリップ

投稿2021/07/16 12:08

編集2021/07/17 02:03

現在、javascriptの学習で スプレットシートからタイムを取得し、条件付きで出力をする処理を行っております。

条件として、(例)A列に〇〇〇〇年〇〇月〇〇日を格納し 
B列に各日付のベストタイムを格納しかつ配列にし年、月、日が合致したら、そのタイムの各月で最もタイムが早いものを各月のベストラップとして配列から取り出し、スプレットシートのセルに書き込むようにしております。

そこで上記に記載したような処理をif else文で作成をしたのですが、コードが膨大になってしまい
処理が重くなってしまってしまいました。

下記が今回のコードになります。

if (2021 == y && 1 == m) { inputSheet.getRange(2, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 2 == m) { inputSheet.getRange(3, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 3 == m) { inputSheet.getRange(4, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 4 == m) { inputSheet.getRange(5, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 5 == m) { inputSheet.getRange(6, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 6 == m) { inputSheet.getRange(7, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 7 == m) { inputSheet.getRange(8, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 8 == m) { inputSheet.getRange(9, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 9 == m) { inputSheet.getRange(10, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 10 == m) { inputSheet.getRange(11, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 11 == m) { inputSheet.getRange(12, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2021 == y && 12 == m) { inputSheet.getRange(13, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 1 == m) { inputSheet.getRange(18, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 2 == m) { inputSheet.getRange(19, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 3 == m) { inputSheet.getRange(20, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 4 == m) { inputSheet.getRange(21, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 5 == m) { inputSheet.getRange(22, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 6 == m) { inputSheet.getRange(23, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 7 == m) { inputSheet.getRange(24, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 8 == m) { inputSheet.getRange(25, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 9 == m) { inputSheet.getRange(26, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 10 == m) { inputSheet.getRange(27, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 11 == m) { inputSheet.getRange(28, 8).setValue(Math.min.apply(null, maleTimeArray)); } else if (2022 == y && 12 == m) { inputSheet.getRange(29, 8).setValue(Math.min.apply(null, maleTimeArray)); }

※ yは年 mは月です。
if (2021 == y && 1 == m)は2021年がy(年と同じ)かつ1月がm(月と同じ)だったら

私はまだjavascript初学者でどのようにしたらもっと処理を軽くし管理がしやすくなるか
お時間のある方がいらっしゃいましたら、ご助言を頂ければ幸いです。

何卒宜しくお願い致します。

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

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

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

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

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

rate_o

2021/07/17 02:04

承知いたしました。 ただいま修正させていただきました。 申し訳ございませんでした。
gentaro

2021/07/17 08:13

言葉に気をつけたほうが良いと思うが…「処理が重い」ってのは計測した結果で判断してる? 正直体感できるほど「重い」と感じる事はないと思う。 単にコードが冗長、複雑になりすぎた、というだけの話じゃない?
rate_o

2021/07/17 08:59

まさにその通りだと思います。 言葉選びが適切でなかったこと誠に申し訳ございません。
guest

回答3

0

計算で求まるんだったら y_waiwaiさんのようにするのがいいと思いますが
もしそうでない場合はこんな方法はどうでしょうか?

javascript

1function getRangeVal(y, m) { 2 const data = { 3 '202101':2, '202102':3, '202103':4, '202104':5, 4 '202105':6, '202106':7, '202107':8, '202108':9, 5 '202109':10, '202110':11, '202111':12, '202112':13, 6 '202201':18, '202202':19, '202203':20, '202104':21, 7 '202205':22, '202206':23, '202207':24, '202108':25, 8 '202209':26, '202210':27, '202211':28, '202112':29}; 9 10 return data[y*100 + m]; 11} 12 13let year = 2022; 14let month = 1; 15 16console.log(getRangeVal(year, month));

※ getRange() の第一パラメタ以外は同じようなので、それを求める方法って意味です。

投稿2021/07/16 13:48

編集2021/07/16 13:50
takasima20

総合スコア7464

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

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

rate_o

2021/07/17 01:48

引数を使用して共通の箇所を一つにし、処理を軽くする考え方でしょうか? わざわざコードまで記述くださりありがとうございます!
guest

0

yが2022の場合はmに12足せば、1から24で判断できますな。
ついでに、その数値からRangeの数値出すように工夫すれば、数行で収まります

2021のときはmに1を足す、2022のときはmに17足す、だけでいけますな。
#3行でいけるやん

投稿2021/07/16 12:24

編集2021/07/16 12:33
y_waiwai

総合スコア88042

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

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

rate_o

2021/07/17 01:46

コメントが遅くなってしまい申し訳ございません。 ご助言ありがとうございます! やってみます!
rate_o

2021/07/17 02:14

申し訳ございません、私の学習量が足りなく、[yが2022の場合はmに12足せば、1から24で判断] [2021のときはmに1を足す、2022のときはmに17足す]の意味が理解ができないのですが、月をfor文で 回して足していくことでコードを少なくしていく感じなのでしょうか? その場合、月ごとの条件をどのように検証はどのようにするのでしょうか? お忙しい中、コメントを頂くことができたのにも関わらず、私の知識が少なく 大変申し訳ございません。
y_waiwai

2021/07/17 02:17

inputSheet.getRange(m+(y==2021)?1:17, 8).setValue(Math.min.apply(null, maleTimeArray)); この1行で。
think49

2021/07/17 03:36

2023年以降も考慮するなら inputSheet.getRange(1+(y-2021)*16+m, 8).setValue(Math.min.apply(null, maleTimeArray));
rate_o

2021/07/17 06:59

御忙しい中、ご回答いただき誠にありがとうございます! また質問になってしまい、申し訳ないのですが、 (1+(y-2021)*16+m, 8)について具体的に教えていただけないでしょうか?
loppta

2021/07/23 16:04

では分かりやすく書き直したコードを。 year=2022,mouth=1 mouthCalc = mouth-1+2 // 月の計算 1月は+2開始 yearCalc = (year-2021)*16 // 年の計算 2022では16+2になるように計算 Calc = yearCalc+mouthCalc console.log(Calc) 出力は 18
guest

0

ベストアンサー

規則性

@y_waiwaiさんのコメント欄より引用します。

(1+(y-2021)*16+m, 8)について具体的に教えていただけないでしょうか?

冗長なコードを短くまとめるコツは規則性を見出すことです。
洗練されたコードは、一定の規則を持ってコードが書かれています。

異なるコードの洗い出し

各コードを順番に確認していき、「共通するコード」と「異なるコード」に分けます
「異なるコード」は次の3つです。

  • 変数 y の値
  • 変数 m の値
  • getRange メソッドの第一引数値(対象セルの行数)

データの洗い出し

先の3つをスプレッドシートに入力します。

y m linage(行数) 2021 1 2 2021 2 3 2021 3 4 2021 4 5 2021 5 6 2021 6 7 2021 7 8 2021 8 9 2021 9 10 2021 10 11 2021 11 12 2021 12 13 2022 1 18 2022 2 19 2022 3 20 2022 4 21 2022 5 22 2022 6 23 2022 7 24 2022 8 25 2022 9 26 2022 10 27 2022 11 28 2022 12 29

数値を分解

linageをスプレッドシート内の行数において、意味のあるグループ別に分解します。
数字から逆算する必要がある我々回答者と違い、@rate_o さんは目の前に実物があるのでこの作業は難しくないはずです。

  • 1行目を飛ばして、2行目に最初のデータ(2021/01)がある事をあなたは知っています
  • 年の変わり目(2021/12~2022/01)に「4行の間隔」がある事をあなたは知っています
y m linage(行数) 分解した式 2021 1 2 1+1 2021 2 3 1+2 2021 3 4 1+3 ... 2021 12 13 1+12 2022 1 18 1+12+4+1 2022 2 19 1+12+4+2 2022 3 20 1+12+4+3 ... 2022 12 29 1+12+4+12 2023 1 34 1+12+4+12+4+1 2023 2 35 1+12+4+12+4+2 2023 3 36 1+12+4+12+4+3 ...

変数を当てはめる

「分解した式」のどこに y, m を代入できるか考えます。
2021年が次の式であることは明らかです。

JavaScript

1linage === 1 + m;
  • 2021/01と2022/01を比較すれば、12+4 の差があることが分かります。
  • 2021/01と2023/01を比較すれば、(12+4)*2 の差があることが分かります。
  • 2021/01と2022/01の比較は (12+4)*1 に置き換えることが可能であり、「1と2の違い」が2021年からの経過年数であることも分かります。

正当性検査

スプレッドシート内で数式を組み、比較演算子 = による確認が全て TRUE ならその数式は正解です。

y m linage 行数を求める数式 正誤判定 2021 1 2 =1+(A2-2021)*16+B2 =C2=D2

コードに落とし込む

「共通するコード」はそのまま利用し、「異なるコード」を算術式に置き換えます。
linage(getRange メソッドの第一引数)は変数 y, m から算術式で演算できる事がここまでの確認で判明している為、1行のコードになります。

JavaScript

1inputSheet.getRange(1+(y-2021)*16+m, 8).setValue(Math.min.apply(null, maleTimeArray));

Re: rate_o さん

投稿2021/07/17 08:05

編集2021/07/17 08:08
think49

総合スコア18189

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

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

rate_o

2021/07/17 09:03

休日にも関わらず、ご教示いただき誠にありがとうございます! 上記の説明をもとに今一度、設計しなおして参ります。 誠に有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問