\r\n\r\n\r\n\r\n\r\n2015/5/4 追記\r\n皆様さっそくのご返信ありがとうございます。\r\nまだまだjsの勉強を始めたばかりの私にとってどれも勉強になりました。\r\n心よりお礼を申し上げます。","answerCount":4,"upvoteCount":0,"datePublished":"2015-05-04T09:10:19.702Z","dateModified":"2015-05-04T13:03:26.155Z","acceptedAnswer":{"@type":"Answer","text":"こんにちは。\r\n私だったら、次のように専用のfunctionを一つ作成すると思います。\r\nご参考になれば、幸いです。\r\n\r\n```lang-javascript\r\n function calc() {\r\n var a = get_checked_value(\"cable\");\r\n var b = get_checked_value(\"connect\");\r\n var ans = a * b;\r\n\r\n var result = document.getElementById(\"result\");\r\n result.innerHTML = \"

料金は\" + ans + \"円です。

\";\r\n\r\n }\r\n\r\n function get_checked_value(name) {\r\n\r\n var elements = document.getElementsByName(name);\r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i].checked) {\r\n return elements[i].value;\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\nコード\r\n```","dateModified":"2015-05-04T09:58:04.234Z","datePublished":"2015-05-04T09:58:04.234Z","upvoteCount":0,"url":"https://teratail.com/questions/9403#reply-13381"},"suggestedAnswer":[{"@type":"Answer","text":"もう一点、一般的なループの最適化という観点で\r\n補足させてください。\r\n\r\n元のループのコード、\r\n```lang-javascript\r\n for(i=0;i料金は\" + ans + \"円です。

\";\r\n}\r\n\r\nfunction checked(element) {\r\n return element.checked;\r\n}\r\n```\r\n読みやすいか読みにくいかは正直微妙な線ですね…。\r\nECMAScript 5th準拠なのでIE8以下では動きません。","dateModified":"2015-05-04T09:54:32.660Z","datePublished":"2015-05-04T09:39:43.892Z","upvoteCount":0,"url":"https://teratail.com/questions/9403#reply-13378","comment":[{"@type":"Comment","text":"[].slice.call()に、NodeListオブジェクトを渡すと、Elementの配列を返してくれるんですね。あと、配列.filter(関数) もjavascriptっぽくていいです。勉強になりました。","datePublished":"2015-05-04T10:14:10.297Z","dateModified":"2015-05-04T10:14:10.297Z"},{"@type":"Comment","text":"Array.prototype.slice.call の方が有名かもしれません。\r\n今の時代気にすることでもないですが、prototypeにアクセスするためIE7以下で使えない欠点がありますし、無駄に長いというのもあって私は [].slice.call としています。(とはいえIE7で [].slice.call が使えるかは知りません^^;)\r\n他にも Array.apply(null, NodeList) という方法もあります。","datePublished":"2015-05-04T10:20:29.616Z","dateModified":"2015-05-04T10:20:29.616Z"},{"@type":"Comment","text":"なるほど。ありがとうございます。ちょっと前、JSのprototype関連、調べたのですが、prototype(継承とか) なんとなく分かった(つもりになった)けど、実際にどういう場面で使うの?と思っていたのですが、自分は「何でもJQueryでやっちゃえ派」なもので、知らなかったのですが、こういうときに出てくるんですね。","datePublished":"2015-05-04T10:29:32.821Z","dateModified":"2015-05-04T10:29:32.821Z"},{"@type":"Comment","text":"いえ、でも効率を考えれば「何でもJQueryでやっちゃえ」は理に適っていると思います。私は元々趣味で書いているので効率度外視でDOMを直で触るコードばかりになっているだけです。\r\nTreeWalkerとかMutationObserverとかは触ってて楽しいですね。","datePublished":"2015-05-04T10:40:17.650Z","dateModified":"2015-05-04T10:40:17.650Z"},{"@type":"Comment","text":"回答ありがとうございます。ちょっと私にはまだ高度な内容でしたが、コード自体は見やすいと感じました。勉強させていただきます!","datePublished":"2015-05-04T13:18:35.220Z","dateModified":"2015-05-04T13:18:35.220Z"}]},{"@type":"Answer","text":"こんにちは。\r\nJQuery を使ってよいのでしたら、\r\n```lang-html\r\n\r\n\r\n\r\n\r\nquestions/9403\r\n\r\n\r\n \r\n
\r\n\r\n
\r\n
\r\n
\r\n緑 \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n銅 \r\n
\r\n
\r\n\r\n \r\n\r\n

ここに値段が表示されます

\r\n\r\n \r\n\r\n\r\n``` \r\n\r\nただし、上記のままだと、cableまたはconnectのいずれか、もしくは両方が\r\n選ばれていない状態で、ボタンをクリックされてしまうと、値段のところに\r\nNaN\r\nと表示されてしまうので、そこは何らかの対応をしたほうがいいかと思います。\r\n\r\n以上です。","dateModified":"2015-05-04T09:29:41.291Z","datePublished":"2015-05-04T09:29:41.291Z","upvoteCount":1,"url":"https://teratail.com/questions/9403#reply-13377","comment":[{"@type":"Comment","text":"jQueryなら $('#result').html(\"

料金は\"+ans+\"円です。

\"); のほうが良いのでは","datePublished":"2015-05-04T09:40:32.022Z","dateModified":"2015-05-04T09:40:32.022Z"},{"@type":"Comment","text":"お題に「特にfor,ifの部分をお願いします。」とあったので、あえてそこだけJQueryを使ってみました。実際にはJQueryを使うなら、おっしゃるとおり、result.innerHTML のようなコードは書かない方がよいですね。","datePublished":"2015-05-04T09:46:42.473Z","dateModified":"2015-05-04T09:46:42.473Z"},{"@type":"Comment","text":"なるほど、そういうことだったのですね。\r\n出過ぎた真似をしてしまって申し訳ありません。","datePublished":"2015-05-04T09:48:36.352Z","dateModified":"2015-05-04T09:48:36.352Z"},{"@type":"Comment","text":"回答ありがとうございます。\r\njQueryで簡易化できることを忘れておりました。勉強になりました。\r\n自分の経験不足等でまだまだ混乱するところがあるのでjsのみで回答していただいた方をベストアンサーとさせていただきます。","datePublished":"2015-05-04T13:16:28.550Z","dateModified":"2015-05-04T13:16:28.550Z"},{"@type":"Comment","text":">>cableまたはconnectのいずれか、もしくは両方が \r\n選ばれていない状態で、ボタンをクリックされてしまうと、値段のところに \r\nNaN と表示されてしまう\r\n\r\nこれの対策をしようと考えていたのですが、実際にはどのようにすればよいのでしょうか?","datePublished":"2015-05-04T13:23:43.378Z","dateModified":"2015-05-04T13:23:43.378Z"},{"@type":"Comment","text":"例えばベストアンサーのtakiuchiさんのコードでは、function get_checked_value(name) が、チェックされたものが無いときに0を返すようになっていますので、「料金は0円です。」という、望ましい表示になるはずです。","datePublished":"2015-05-04T13:28:08.683Z","dateModified":"2015-05-04T13:28:08.683Z"},{"@type":"Comment","text":"ご返信ありがとうございます。難しく考える必要はなかったんですね。","datePublished":"2015-05-04T13:33:13.560Z","dateModified":"2015-05-04T13:33:13.560Z"},{"@type":"Comment","text":"はい。あと、私のほうのだと、ans をJQueryで計算している行の後に、\r\nans = ( isNaN(ans) ? 0 : ans );\r\nを入れてやればOKかと思います。","datePublished":"2015-05-04T13:39:21.529Z","dateModified":"2015-05-04T13:39:21.529Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/for","name":"forに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/9403","name":"[js] このコードをもっと簡単にかけませんか?"}}]}}}
質問するログイン新規登録

Q&A

解決済

4回答

2602閲覧

[js] このコードをもっと簡単にかけませんか?

twin_bird

総合スコア230

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JavaScript

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2015/05/04 09:10

編集2015/05/04 13:03

0

0

下記のコードをもう少し簡単(わかりやすく)に書くことはできませんでしょうか?
特にfor,ifの部分をお願いします。

<body> <form> <div id="a"> <INPUT TYPE="radio" name="cable" value="100">青<br/> <INPUT TYPE="radio" name="cable" value="200">赤<br/> <INPUT TYPE="radio" name="cable" value="300">緑 </div> </form> <form> <div id="b"> <INPUT TYPE="radio" name="connect" value="100">金<br/> <INPUT TYPE="radio" name="connect" value="200">銀<br/> <INPUT TYPE="radio" name="connect" value="300">銅 </div> </form> <INPUT TYPE="button" value="click" onClick="calc();"> <p id="result">ここに値段が表示されます</p> <script type="text/javascript"> function calc(){ var cable = document.getElementsByName("cable"); var connect = document.getElementsByName("connect"); var a; var b; for(i=0;i<cable.length;i++){ if(cable[i].checked){ a = cable[i].value; } } for(i=0;i<connect.length;i++){ if(connect[i].checked){ b = connect[i].value; } } var ans = a*b; var result = document.getElementById("result"); result.innerHTML = "<p>料金は"+ans+"円です。</p>"; } </script> </body>

2015/5/4 追記
皆様さっそくのご返信ありがとうございます。
まだまだjsの勉強を始めたばかりの私にとってどれも勉強になりました。
心よりお礼を申し上げます。

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

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

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

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

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

guest

回答4

0

こんにちは。
JQuery を使ってよいのでしたら、

lang

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>questions/9403</title> 6<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script> 7</head> 8<body> 9<form> 10 11<div id="a"> 12<INPUT TYPE="radio" name="cable" value="100">青<br/> 13<INPUT TYPE="radio" name="cable" value="200">赤<br/> 14<INPUT TYPE="radio" name="cable" value="300">緑 15</div> 16</form> 17 18<form> 19<div id="b"> 20<INPUT TYPE="radio" name="connect" value="100">金<br/> 21<INPUT TYPE="radio" name="connect" value="200">銀<br/> 22<INPUT TYPE="radio" name="connect" value="300">銅 23</div> 24</form> 25 26<INPUT TYPE="button" value="click" onClick="calc();"> 27 28<p id="result">ここに値段が表示されます</p> 29 30<script type="text/javascript"> 31function calc(){ 32 33 var ans = $("input[name='cable']:checked").val() 34 * $("input[name='connect']:checked").val(); 35 36 var result = document.getElementById("result"); 37 result.innerHTML = "<p>料金は"+ans+"円です。</p>"; 38} 39</script> 40</body> 41</html>

ただし、上記のままだと、cableまたはconnectのいずれか、もしくは両方が
選ばれていない状態で、ボタンをクリックされてしまうと、値段のところに
NaN
と表示されてしまうので、そこは何らかの対応をしたほうがいいかと思います。

以上です。

投稿2015/05/04 09:29

jun68ykt

総合スコア9058

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

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

htsign

2015/05/04 09:40

jQueryなら $('#result').html("<p>料金は"+ans+"円です。</p>"); のほうが良いのでは
jun68ykt

2015/05/04 09:46

お題に「特にfor,ifの部分をお願いします。」とあったので、あえてそこだけJQueryを使ってみました。実際にはJQueryを使うなら、おっしゃるとおり、result.innerHTML のようなコードは書かない方がよいですね。
htsign

2015/05/04 09:48

なるほど、そういうことだったのですね。 出過ぎた真似をしてしまって申し訳ありません。
twin_bird

2015/05/04 13:16

回答ありがとうございます。 jQueryで簡易化できることを忘れておりました。勉強になりました。 自分の経験不足等でまだまだ混乱するところがあるのでjsのみで回答していただいた方をベストアンサーとさせていただきます。
twin_bird

2015/05/04 13:23

>>cableまたはconnectのいずれか、もしくは両方が 選ばれていない状態で、ボタンをクリックされてしまうと、値段のところに NaN と表示されてしまう これの対策をしようと考えていたのですが、実際にはどのようにすればよいのでしょうか?
jun68ykt

2015/05/04 13:28

例えばベストアンサーのtakiuchiさんのコードでは、function get_checked_value(name) が、チェックされたものが無いときに0を返すようになっていますので、「料金は0円です。」という、望ましい表示になるはずです。
twin_bird

2015/05/04 13:33

ご返信ありがとうございます。難しく考える必要はなかったんですね。
jun68ykt

2015/05/04 13:39

はい。あと、私のほうのだと、ans をJQueryで計算している行の後に、 ans = ( isNaN(ans) ? 0 : ans ); を入れてやればOKかと思います。
guest

0

ベストアンサー

こんにちは。
私だったら、次のように専用のfunctionを一つ作成すると思います。
ご参考になれば、幸いです。

lang

1 function calc() { 2 var a = get_checked_value("cable"); 3 var b = get_checked_value("connect"); 4 var ans = a * b; 5 6 var result = document.getElementById("result"); 7 result.innerHTML = "<p>料金は" + ans + "円です。</p>"; 8 9 } 10 11 function get_checked_value(name) { 12 13 var elements = document.getElementsByName(name); 14 for (var i = 0; i < elements.length; i++) { 15 if (elements[i].checked) { 16 return elements[i].value; 17 } 18 } 19 20 return 0; 21 } 22 23コード

投稿2015/05/04 09:58

takiuchi

総合スコア29

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

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

twin_bird

2015/05/04 13:10

回答ありがとうございます。 functionを追加する方法を考えていたのですが、混乱しており、takiuchiの回答が参考になりましたためベストアンサーとさせていただきました。
twin_bird

2015/05/04 13:20

訂正 takiuchi → takiuchiさん 敬称が抜けておりました。失礼いたしました。
guest

0

もう一点、一般的なループの最適化という観点で
補足させてください。

元のループのコード、

lang

1 for(i=0;i<cable.length;i++){ 2 if(cable[i].checked){ 3 a = cable[i].value; 4 } 5 }

は、以下のように、該当するものが見つかったときに
break
を入れたほうがよいと思います。

lang

1 for(i=0;i<cable.length;i++){ 2 if(cable[i].checked){ 3 a = cable[i].value; 4 break; 5 } 6 }

break がないと、i がある値のときに if 条件がtrue になって、
a の値が確定した後も(律儀に)、i = cable.length-1 となる
まで、ループが回ってしまいます。

以上です。

投稿2015/05/04 09:40

jun68ykt

総合スコア9058

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

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

twin_bird

2015/05/04 13:12

breakのご指摘ありがとうございます。完全に忘れていました笑
guest

0

ykt68さんのご意見のように素直にjQueryを使う方がスッキリ書けると思います。
JavaScriptのみで書くのでしたらこんな感じでしょうか。

lang

1function calc(){ 2 var cable = [].slice.call(document.getElementsByName("cable")); 3 var connect = [].slice.call(document.getElementsByName("connect")); 4 5 var a = cable.filter(checked)[0].value; 6 var b = connect.filter(checked)[0].value; 7 8 var ans = a * b; 9 var result = document.getElementById("result"); 10 result.innerHTML = "<p>料金は" + ans + "円です。</p>"; 11} 12 13function checked(element) { 14 return element.checked; 15}

読みやすいか読みにくいかは正直微妙な線ですね…。
ECMAScript 5th準拠なのでIE8以下では動きません。

投稿2015/05/04 09:39

編集2015/05/04 09:54
htsign

総合スコア870

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

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

jun68ykt

2015/05/04 10:14

[].slice.call()に、NodeListオブジェクトを渡すと、Elementの配列を返してくれるんですね。あと、配列.filter(関数) もjavascriptっぽくていいです。勉強になりました。
htsign

2015/05/04 10:20

Array.prototype.slice.call の方が有名かもしれません。 今の時代気にすることでもないですが、prototypeにアクセスするためIE7以下で使えない欠点がありますし、無駄に長いというのもあって私は [].slice.call としています。(とはいえIE7で [].slice.call が使えるかは知りません^^;) 他にも Array.apply(null, NodeList) という方法もあります。
jun68ykt

2015/05/04 10:29

なるほど。ありがとうございます。ちょっと前、JSのprototype関連、調べたのですが、prototype(継承とか) なんとなく分かった(つもりになった)けど、実際にどういう場面で使うの?と思っていたのですが、自分は「何でもJQueryでやっちゃえ派」なもので、知らなかったのですが、こういうときに出てくるんですね。
htsign

2015/05/04 10:40

いえ、でも効率を考えれば「何でもJQueryでやっちゃえ」は理に適っていると思います。私は元々趣味で書いているので効率度外視でDOMを直で触るコードばかりになっているだけです。 TreeWalkerとかMutationObserverとかは触ってて楽しいですね。
twin_bird

2015/05/04 13:18

回答ありがとうございます。ちょっと私にはまだ高度な内容でしたが、コード自体は見やすいと感じました。勉強させていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問