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

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

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

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

Q&A

解決済

8回答

3537閲覧

jsに限らず、for文の中のif文でのスマートな書き方

yoshipu

総合スコア115

JavaScript

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

1グッド

1クリップ

投稿2018/07/20 13:15

編集2018/07/21 05:30

for文の中でif文があるケースで該当するものがあればそれを代入。なければ、特定のキーの値を代入するケースで、次のように書いたのですが、もっとスマートな書き方や別の方法をもしご存知でしたら教えていただけないでしょうか。

javascript

1var datas = ['hoge', 'fuga', 'piyo']; 2var value = '' 3var flag = false; 4 5for (var key in datas) { 6 if(datas[key] == 'fuga'){ 7 value = datas[key]; 8 flag = true; 9 break; 10 } 11} 12 13if (! flag) { 14 value = datas[0]; 15}
jun68ykt👍を押しています

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

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

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

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

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

jun68ykt

2018/07/21 03:27 編集

think49さんのご回答にある2つ目のコードにあるように、 for を途中で抜けるためにbreakを使うということも覚えておいて損はありません。break; がない元のコードですと、例えばもしdatas に1000個の要素があり、先頭の要素が "fuga" で、残り 999個が "hoge" だったとすると、先頭の1個目で合致した時点で flag が trueになって欲しい結果がその時点で決まっても、あとの 999個についても、if(datas[key] == 'fuga') の(無駄な)比較をすることになってしまいます。
退会済みユーザー

退会済みユーザー

2018/07/21 05:34 編集

って、言ってる↑これ、全然ダメだから話になんねぇので覚えるだけ無駄だぞ。
guest

回答8

0

状況次第だと思いますがこのケースだと、

JavaScript

1var datas = ['hoge', 'fuga', 'piyo']; 2var value; 3 4value = datas[0]; 5for (var key in datas) { 6 if(datas[key] == 'fuga'){ 7 value = datas[key]; 8 } 9}

でしょうか。

あと、datasって、もしかして英単語のdataを忘れたのでしょうか。
dataが複数形ですよ(複数形が不規則変化の名詞)。

投稿2018/07/20 13:23

otn

総合スコア84498

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

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

yoshipu

2018/07/20 14:40

ありがとうございます。dataが複数形なのも初めて知りました。
退会済みユーザー

退会済みユーザー

2018/07/20 22:35

これは、ゴルフじゃ無いけど、大して勉強にもならない。 なぉ、dataは単複同形だが、データのまとまりのまとまりのようなものはネイティブでもdatasと表記するのでdatasが間違いと、いうわけではない。
退会済みユーザー

退会済みユーザー

2018/07/20 22:35

ちがった。単数形はdatumだったかな。
退会済みユーザー

退会済みユーザー

2018/07/20 22:42

やっぱそうだった。luckerお兄さんはさすが過ぎるな。
think49

2018/07/21 02:35

> dataが複数形ですよ(複数形が不規則変化の名詞)。 「datalist要素」という前例はありますね。 https://momdo.github.io/html/form-elements.html#the-datalist-element datalist要素においては "data" が単数(option要素)でないと "list" の意味が通りません。 「data(単数形/複数形)」は文脈次第というところでしょうか。
退会済みユーザー

退会済みユーザー

2018/07/21 03:58

うん、だからluckerお兄さんがネイティヴでもdatas使うって言ったやん? 文盲なん?
otn

2018/07/21 04:08

> データのまとまりのまとまり ファイルやデータベースが複数あるケースとかですね。
退会済みユーザー

退会済みユーザー

2018/07/21 04:26

例えば、そう言う事だね。
guest

0

こんにちは。

配列の中に特定の値が含まれているかどうかの判定について、補足します。

ES2016 から Array.prototype.includes が追加され、Javascript にも実装されています。

javascript

1const datas = ['hoge', 'fuga', 'piyo']; 2 3console.log(datas.includes('fuga')); // => true 4console.log(datas.includes('foo')); // => false

indexOfを使った場合と違うのは、NaN が含まれるかどうかを判定できることです。

javascript

1const numbers = [1, 2, 3, NaN]; 2 3console.log(numbers.includes(NaN)); // => true 4console.log(numbers.indexOf(NaN)); // => -1

以下、上記のデモです。

https://jsfiddle.net/jun68ykt/we5u8ar1/3/

参考になれば幸いです。

投稿2018/07/21 00:08

jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2018/07/21 00:10

うん、だから、それは質問者が聞いてる事じゃ、無い。 Could u understand?
退会済みユーザー

退会済みユーザー

2018/07/21 00:13

「jsに限らず、」が読めない非日本人ばっかと言う事で。
think49

2018/07/21 01:56

方法論としては最良と思いますが、なぜ「低評価1」なのでしょう…。
退会済みユーザー

退会済みユーザー

2018/07/21 02:09

日本語が読めない人、更にマシマシ。
jun68ykt

2018/07/21 03:24

@think49さん コメントありがとうございます。   低評価をお付けになった方は、おそらく「お前はまだ修行が足りない」と仰りたいものと拝察しておりまして、大変ありがたいご鞭撻を頂戴したと受けとめており、今後一層、研鑽に努めてまいる所存でございます。
guest

0

私はこの質問を読んだ時、2つの答えを用意出来ましたが、質問文のどちらにフォーカスすべきか判断できませんでした。
ベストアンサー結果を見る限りでは、前者が正解でしたが、どちらの答えも正解になりうるように読めました。

スマートな書き方

もっとスマートな書き方や別の方法をもしご存知でしたら教えていただけないでしょうか。

単純に質問文のコードをスマートに書きたいだけのパターン。

JavaScript

1var array = ['hoge', 'fuga', 'piyo']; 2var result = array.includes('fuga') ? 'fuga' : array[0]; 3 4console.log(result); // "fuga"

for文内の条件式が偽だった場合を判定

for文の中でif文があるケースで該当するものがあればそれを代入。なければ、特定のキーの値を代入するケースで、

条件式の内容はどうでもよく、for文の外で条件式の真偽判定して代入値を制御したいパターン。

JavaScript

1function sample1 (array) { 2 var result = array[0]; // 初期値を与える 3 4 for (let value of array) { 5 if (value === 'fuga') { 6 result = 'fuga'; 7 break; 8 } 9 } 10 11 return result; 12} 13 14var array1 = ['hoge', 'fuga', 'piyo'], 15 array2 = ['hoge', 'fuga2', 'piyo']; 16 17console.log(sample1(array1)); // "fuga" 18console.log(sample1(array2)); // "hoge"

while 文版。

JavaScript

1function sample2 (array) { 2 var i = array.length; 3 4 while (--i > 0 && array[i] !== 'fuga'); 5 6 return array[i]; 7} 8 9var array1 = ['hoge', 'fuga', 'piyo'], 10 array2 = ['hoge', 'fuga2', 'piyo']; 11 12console.log(sample2(array1)); // "fuga" 13console.log(sample2(array2)); // "hoge"

Re: yoshipu さん

投稿2018/07/21 02:28

編集2018/07/21 03:41
think49

総合スコア18162

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

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

jun68ykt

2018/07/21 03:05

"スマートな書き方" で挙げられているようなコードをさっと書けることも大事ですが、"for文内の条件式が偽だった場合を判定" のほうのコードにあるように、こういう場合は break; を使って、走査対象の配列要素のすべてを調べる前にループを抜けることができると思いつくことも大事ですね。
退会済みユーザー

退会済みユーザー

2018/07/21 03:38

それじゃ質問者は何も学べないってのと、 何で二択したんだ、要求判断力ねぇのか?ってのと、 何でjunはわかってる気になってんだ?っての度外視すると、 まぁ、ティン49兄さんが一番かすってるから今回だけはプラスしといてやる。
think49

2018/07/21 03:46

To: jun68ykt さん 無駄を排除するのは大切ですね。 突き詰めると、if文も省略できる事に気が付いたので、コードを追記しておきました。
退会済みユーザー

退会済みユーザー

2018/07/21 03:49

またゴルフはじめやがった。 こいつら、仕事した事あんのかな? 本当に。
退会済みユーザー

退会済みユーザー

2018/07/21 03:51

基本的なコードの書き方のイロハを知らずに小手先の技術ばっかかたりはじめるから、いつまでたっても一人前の仕事人になれん。
退会済みユーザー

退会済みユーザー

2018/07/21 04:04

お前ら全員の事言ってんだからな?
jun68ykt

2018/07/21 05:59 編集

@think49さん > 突き詰めると、if文も省略できる事に気が付いたので、コードを追記しておきました。 なるほどです。そのwhileでも配列の全要素を読むことがなくなりますね。 ところで、 > 私はこの質問を読んだ時、2つの答えを用意出来ましたが、質問文のどちらにフォーカスすべきか判断できませんでした。 とのことですが、質問者さんが投稿された質問のタイトルや質問本文のテキストから文字通り読み取れる、回答を求められていることが、必ずしも質問者さんが本当に知りたいことではないという可能性が常にあると思いますので、そこをちゃんと質問者さんの言葉の裏にある真意を想像することで、 > 私はこの質問を読んだ時、2つの答えを用意出来ましたが、質問文のどちらにフォーカスすべきか判断できませんでした。 という逡巡は共感できますし、私もよくあります。
退会済みユーザー

退会済みユーザー

2018/07/21 06:16

なら、両方の視点から1つの答えを導けばいいじゃん。
退会済みユーザー

退会済みユーザー

2018/07/21 06:19 編集

辿り着く場所が別だって言うなら、それはそもそも、少なくともどっちかが間違った考え方なんだよ。
guest

0

今回は「あるかどうか」だけ調べればいいので、Array.prototype.indexOfを使いましょう(MDN)。

javascript

1var datas = ['hoge', 'fuga', 'piyo']; 2var value = '' 3 4if(dates.indexOf('fuga')!== -1) { 5 value='fuga'; 6} else { 7 value=dates[0]; 8}

投稿2018/07/20 13:24

maisumakun

総合スコア145183

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

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

maisumakun

2018/07/20 13:25

なお、for-inを配列に使うことは、余計なものをピックアップしたり、疎な配列の要素が抜けたりするので、あまりおすすめできません。
otn

2018/07/20 14:03

「jsに限らず」という質問なので、(forのある)どの言語でも通用する書き方を求めているのかと思います。
yoshipu

2018/07/20 14:39

ありがとうございます。参考になりました。
退会済みユーザー

退会済みユーザー

2018/07/20 22:31

これも、ゴルフ。
maisumakun

2018/07/20 22:53

「もっとスマートな書き方」というのを、「for文の中でif文があるケース」自体をスマートに書き換えるもの、と解釈していました。
退会済みユーザー

退会済みユーザー

2018/07/20 22:58

else がある時点でスマートじゃないやっつけコード。
guest

0

ベストアンサー

javascript

1var datas = ['hoge', 'fuga', 'piyo']; 2var value = (datas.indexOf('fuga') != -1) ? 'fuga': datas[0]; 3console.log(value);

投稿2018/07/20 13:26

編集2018/07/20 17:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yoshipu

2018/07/20 14:38

ありがとうございます。参考になりました。目からウロコです。スマートです。
miyabi-sun

2018/07/20 17:25

datas.indexOf('fuga')は見つからない場合-1を返すメソッドであり、 -1をif文や三項演算子の左辺に放り込むとtrueとして判定されます。 datasの3要素目にfugaが存在する場合、このコードでは取得出来ず要件を満たしていません。
退会済みユーザー

退会済みユーザー

2018/07/20 17:36

> miyabi-sun さん ご指摘ありがとうございます
bwz61366

2018/07/20 20:43

> miyabi-sun さん miyabi-sun さんの、コメントの上2文には同意できますが、最後の行だけ意味が理解できません。 いったいどのような意味でしょうか。よろしければご返信お願いします_ _
退会済みユーザー

退会済みユーザー

2018/07/20 22:31

これは回答じゃなくて、ゴルフ。
think49

2018/07/21 02:10

To: miyabi-sun さん > datasの3要素目にfugaが存在する場合、このコードでは取得出来ず要件を満たしていません。 経過動作として、「代入処理が2回行われる」はなくなりますが、条件式が真なら、value = "fuga" という結果は変わりません。 どうしても、気になるなら Array#lastIndexOf を使えばいいですが、結果は変わりません。 質問者のコード http://jsfiddle.net/5ka7mtyj/2/ Kosuke_Shibuyaさんのコード http://jsfiddle.net/5ka7mtyj/5/ Array#lastIndexOf http://jsfiddle.net/5ka7mtyj/7/ あえて、違いを見出すのなら、質問者のコードは等価比較なのに対して、Kosuke_Shibuyaさんのコードは厳密比較になっています。 質問者のコードは「1 == "1"」でtrueですが、Kosuke_Shibuyaさんのコードは「1 === "1"」でfalseです。 最後に、要素値に NaN があった場合に正しく判定されない、というjun68yktさんの指摘が気になりますね(最も、質問者のコードも同じ問題がありますが)。
退会済みユーザー

退会済みユーザー

2018/07/21 03:46

だからゴルファーはコンペでだけ腕を競い合ってよ。何の役にも立たないから。
bwz61366

2018/07/21 06:28

> think49 さん あ、やっぱりそんな感じですよね。JavaScriptは詳しくないので、勉強になりました_ _
退会済みユーザー

退会済みユーザー

2018/07/21 06:33

そんなJavaScriptでしか利用できない知識覚えてなんになるの…
guest

0

for文の中でif文があるケースで該当するものがあればそれを代入。なければ、特定のキーの値を代入するケース

このケースだと、「なければ」の部分を読み替えて、最初に代入してあげるときれいになります。

JavaScript

1var value = datas[0];

今回は関係ないですけど、flag って出てきたら、continue とか break とかと配列組み合わせるとイケるんじゃね?って考えるときれいに書けるケースが多いです。

投稿2018/07/21 02:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/21 02:50

あー要件次第ですけど、このケースでも break 使ったほうが良いかもしれないですね^^;最初を取るか、最後を取るか?
退会済みユーザー

退会済みユーザー

2018/07/21 03:54

なんでそんななんとなくな感じで今までコード書いてきちゃったん?
退会済みユーザー

退会済みユーザー

2018/07/21 03:55

活いれといた。
退会済みユーザー

退会済みユーザー

2018/07/21 04:04

意味がわからん^^;ちゃんと回答読んでる? そろそろ自分の回答修正すればよいかと。 ここのコメントでやり取りするのめんどい。
退会済みユーザー

退会済みユーザー

2018/07/21 04:09

意味がわからない? …とか…とかだと…じゃね?だと…になる事がなんとなく多いです。時と場合によりけりなんで、この場合は…かもしれませんけどねー。マジ、どっちにしましょ? ↑これ、お前の回答の要約。凄まじいなんとなくな適当感漂ってるだろ、どう見ても。
退会済みユーザー

退会済みユーザー

2018/07/21 04:21

やっぱり、回答読んでないのね^^; 要件を読み替えて、初期値を var value = datas[0]; とするときれいに書けるよって書いてるんだけど。 こっちにコメントしてないで、回答修正して収束すれば?
退会済みユーザー

退会済みユーザー

2018/07/21 04:33

まさか、マジでそっちが本題だったの? それは本当の本当に要件次第だけど、 どうしてそんな、要件を捻じ曲げちゃうような適当な回答しちゃうの?
退会済みユーザー

退会済みユーザー

2018/07/21 04:34

まーさーかー、ここまで底レヴェルだとは、お釈迦様でもお富さん。
退会済みユーザー

退会済みユーザー

2018/07/21 04:56

この回答も理解出来てないし、自身の回答も回答になってないし、そろそろちゃんとしようよ。。。 なんか書きたいことがあるんだろうけど、書かんと分からんよ^^;
退会済みユーザー

退会済みユーザー

2018/07/21 05:01

なんで理解できてないと思うんだお前は。 こうすっとフラグいらなくなるっしょ?って言いたいだけだろ、お前は。 だから、それこそ要件次第で、今回聞かれてることには関係ねーだろ。 頭に赤飯でも詰まってんのか、お前は。
退会済みユーザー

退会済みユーザー

2018/07/21 05:24

> こうすっとフラグいらなくなるっしょ?って言いたいだけだろ、お前は。 > だから、それこそ要件次第で、今回聞かれてることには関係ねーだろ。 そそwその理解で正しいわ。 書きたかったこと、今回の件とあんまりカンケーないのよ。 そこまでわかっててなんで理解できないかなぁ。。。 余談の扱いなんで、あんまり長く書けないから、ざっくり書いたのよ。 「今回は関係ないですけど」以下が30行も続いたら、おかしいでしょ。
退会済みユーザー

退会済みユーザー

2018/07/21 05:27

だーかーらー、 質問文をよく読んで、質問者のコード見て、質問者が知りたかった本当のタイヤブランコを理解しろってば。
退会済みユーザー

退会済みユーザー

2018/07/21 05:29

あのな、いまだに分かってないようだからあえて言うけど、 俺のほうがおまえら全員よりも遥かに綜合技能レヴェル上なんだからな。 いい加減、理解してくれ。
退会済みユーザー

退会済みユーザー

2018/07/21 05:32

自分でやってから言ってくれ^^; > そろそろ自分の回答修正すればよいかと。 > ここのコメントでやり取りするのめんどい。
退会済みユーザー

退会済みユーザー

2018/07/21 05:33

おまえらが全員頭下げるっていうなら、教えてやらんことはないぞ。
退会済みユーザー

退会済みユーザー

2018/07/21 05:36

それはオレの求めてるタイヤブランコじゃないわ。
退会済みユーザー

退会済みユーザー

2018/07/21 05:37

赤飯の塩加減の事なんか知るか!
退会済みユーザー

退会済みユーザー

2018/07/21 05:42

> 書きたかったこと、今回の件とあんまりカンケーないのよ。 ここまでちゃんと理解した仲なのにw
guest

0

なんでこんなバカ回答ばっかりに…

お題を変えちゃダメだろ。
何の勉強にもならない小手先技ばっか覚えてもしょうがねぇだろうに。
これだからふろんとえんじにぁーはダメなんだよ。

みやびも間違い探しとかやってないで
もっと教えるべきことを教えろよ。

投稿2018/07/20 22:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/20 23:09

質問者としては運命の分かれ道だな。これから5年闇を彷徨う亡者になるか、5年分すっ飛ばして人間になるか。
退会済みユーザー

退会済みユーザー

2018/07/20 23:10

寺はロボしかいないから、気づかずに従ってるとロボ一直線だ。
退会済みユーザー

退会済みユーザー

2018/07/20 23:11

そういえば、みやびは転職して亡者を選んだんだっけ…
guest

0

学習中でスマートな記述は書けませんが、forでなければいけないのですか?
判定処理が複雑になるようでしたらwhileでもいいと思います。

投稿2018/07/20 13:31

makoto-n

総合スコア436

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

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

yoshipu

2018/07/20 14:36

ありがとうございます。参考になりました。
退会済みユーザー

退会済みユーザー

2018/07/20 22:39

質問者が知りたいのはループに何を使うのかではなく、ループ内で分岐を使う場合の正しい書き方。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問