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

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

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

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

Q&A

解決済

3回答

224閲覧

このコードを短くしたい

kimurayu

総合スコア158

JavaScript

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

0グッド

0クリップ

投稿2017/11/05 05:16

編集2017/11/05 05:52

a に 1 か 2 が入る関数です。 Aは何度も呼ばれ、戻り値も使います。
この処理をもっと短くかけませんでしょうか。

js

1var is2 = false; 2var A = function(a) { 3 if(a === 1) { 4 if(is2) { 5 is2 = false; 6 return true; 7 } else { 8 return false; 9 } 10 } else { 11 is2 = true; 12 return false; 13 } 14}; 15 16 17A(1)A(2) がランダムで何度も呼ばれる 18戻り値も使う

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

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

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

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

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

guest

回答3

0

ベストアンサー

アルゴリズムとしては十分に絞られているので、アルゴリズム上の無駄はないと思います。
あえて工夫を加えるとすれば、三項演算子カンマ演算子を使うなどして文法を変えることが考えられます。

JavaScript

1'use strict'; 2var is2 = false; 3 4function A (a) { 5 if (a === 1) { 6 return is2 ? (is2 = false, true) : false; 7 } 8 9 is2 = true; 10 return false; 11} 12 13console.log(A(1)); // false 14console.log(A(2)); // false 15console.log(A(1)); // true 16console.log(A(2)); // false

個人的には「フラグ変数」を使わない方向に修正した方が良いと思います。
このロジックで進めるなら、修正する限度は知れたものですが、設計面から変えていけばもう少し、洗練されたコードになるかもしれません。

Re: kimurayu さん

投稿2017/11/05 06:02

think49

総合スコア18164

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

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

kimurayu

2017/11/05 06:22 編集

フラグ変数を使わない方法というのは、全く見当がつきません..ですがその方がいいみたいですね。 カンマ演算子は初めて知りました。これはとても便利ですね。ありがとうございます。
guest

0

function isEqualToOne(value){ return value === 1; } var is2 = false; is2 = !isEqualToOne(1)

掲載のis2という真偽値を持つ変数と、isEqualToOne関数が返す真偽値が意味合い的に整合性取れませんが、掲載のコードとやってることは同じかと思います。

関数内で関数外の変数を書き換えてしまうのは、コードが増えてきた時にバグの混入の原因になりかねないので、関数内で関数外の変数を書き換えない方向性で書きました。

追記
関数Aの引数が1の時にfalseが返ることもあるのですね。
そうなると、自分の書いたコードは求めてるものと違いますね。

投稿2017/11/05 05:32

編集2017/11/05 06:18
HayatoKamono

総合スコア2415

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

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

kimurayu

2017/11/05 07:40

いえ、ありがとうございます!
guest

0

これで一行になりました!

js

1var is2 = false; 2var a = function (e) { 3 return e === 1 ? (is2 ? (is2 = false, true) : false) : (is2 = true, false); 4} 5console.log(a(1)) 6console.log(a(2)) 7console.log(a(1)) 8console.log(a(1))

投稿2017/11/05 07:39

kimurayu

総合スコア158

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

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

kimurayu

2017/11/05 07:42

think49 さんのベストアンサーより です
kei344

2017/11/05 07:53

var a = e => !!( e === 1 ? ( is2 ? ( is2 = !is2, 1 ) : 0 ) : ( is2 = !!1, 0 ) ); アロー関数が使える環境ならもう少し短くなりますよ。
kimurayu

2017/11/05 07:59

ああ、その通りです! '!!' これも初めて見ました。真偽値に変換するんですね。こうすればさらに短くなりますね。ありがとうございます!
think49

2017/11/05 08:45 編集

仰る通り、三項演算子をネストすれば、1行で書けますが、あまり短くすることに神経を注ぐと、後で読んだときに分かりにくいコードになってしまいがちなので、私はお勧めしていません。 (個人的には、三項演算子のネストは読みづらく感じるので、私はコード量が増えたとしても、ネストしないコードを使います。) 重要なのは、「アルゴリズムが明快に分かる程度に」短く簡潔にまとまっていることです。 短く事で読みづらく感じるのなら本末転倒で、それぐらいならコードが長くても可読性が高いコードが良いです。 質問文のコードは特に無駄のあるコードではないので、個人的にはこのままでも問題ないと思います。 ただ、フラグ変数が入っている事でアルゴリズムが読み取りづらくなっている節はあるので、その点では改善の余地があると考えています。 フラグ変数の初期化処理を除けば、実行している内容は「a === 1 && !!is2 だけ」ですので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問