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

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

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

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

Q&A

解決済

1回答

251閲覧

ループ処理で出た値を配列に格納させたい

Kousukeh10969

総合スコア20

JavaScript

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

0グッド

0クリップ

投稿2019/06/03 11:40

目標:合計金額を出したい。

現状:totalpriceが一回一回のループ処理で出ている。

自分が考えた対策法空の配列を作ってそこに、ループ処理の結果を一つずつ入れていき、popメソッドで最後の値だけ取り出す

しかし、そのやり方が分からなく、調べても出てこない為、質問させていただきました。

js

1'use strict'; 2 3$(function () { 4 5 const tops = [ 6 {name: `UクルーT`, price: 1000}, 7 {name: `ワッフルクルーT`, price: 1500}, 8 {name: `ドライカノコポロシャツ`, price: 1990}, 9 {name: `UオーバーサイズクルーT`, price: 1500}, 10 {name: `UグラフィックT`, price: 1500}, 11 {name: 'エアリズムT', price: 990} 12 13 ]; 14 // console.log(t[Math.floor(Math.random()*t.length)]); 15 // result.textContent = t[Math.floor(Math.random()*t.length)].name; 16 17 const bottoms = [ 18 {name: '感動パンツ', price: 3990}, 19 {name: 'ウルトラストレッチスキニージーンズ', price: 3990}, 20 {name: 'EZYアンクルパンツ', price: 2990}, 21 {name: 'チノハーフパンツ', price: 1990}, 22 ]; 23 24 $('#search').on('click', function() { 25 let money = $('.main-top__content--money').val(); 26 let style = $('.main-top__content--style').val(); 27 28 let totalprice = 0; 29 30 $('#result').empty(); 31 $('#totalPrice').empty(); 32 33 while (totalprice <= money) { 34 let nonce = Math.floor(Math.random()*tops.length); 35 let name = tops[nonce].name; 36 let price = tops[nonce].price; 37 38 totalprice += price; 39 40 if (totalprice > money) { 41 break 42 }; 43 44 // 空の配列を作ってtotalpriceの値をひとつずつ入れていき、pop()で最後の値をとろうとした 45 // let sum = []; 46 // sum.push(totalprice); 47 // console.log(sum); 48 // let last = sum.pop(); 49 50 $('#result').append("商品名"+ "&nbsp"+ name + "&nbsp" + price + "円" + "<br>"); 51 $('#totalPrice').append("合計金額"+ totalprice + "円"); 52 // append(); 要素の追加 53 //合計金額A円合計金額A+B円合計金額A+B+C円みたいになってしまう 54 } 55 56 }); 57 58}); 59コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

前提知識の説明

while(/* 条件 */) { /* 処理 */ } 構文は、繰り返し処理のための構文で、条件部分に記述した式が新となる限り、 処理の部分に記述したコードを 繰り返し 実行します。

質問のコードですと、以下の部分が while 構文の 処理 の部分として記述されているので、条件を満たす限り繰り返し実行される部分になります。

javascript

1 let nonce = Math.floor(Math.random()*tops.length); 2 let name = tops[nonce].name; 3 let price = tops[nonce].price; 4 5 totalprice += price; 6 7 if (totalprice > money) { 8 break 9 }; 10 11 // 空の配列を作ってtotalpriceの値をひとつずつ入れていき、pop()で最後の値をとろうとした 12 // let sum = []; 13 // sum.push(totalprice); 14 // console.log(sum); 15 // let last = sum.pop(); 16 17 $('#result').append("商品名"+ "&nbsp"+ name + "&nbsp" + price + "円" + "<br>"); 18 $('#totalPrice').append("合計金額"+ totalprice + "円"); 19 // append(); 要素の追加 20 //合計金額A円合計金額A+B円合計金額A+B+C円みたいになってしまう 21

そしてコード中に記述されている通り、

javascript

1$('#totalPrice').append("合計金額"+ totalprice + "円");

は要素を 追加 するメソッドなので、実行するたびに文字列が要素に追加されていくことになります。

質問者様が考えられた解決法について

普通そんな方法はとりませんが、一応解説しますと、
ループ(while) より前で、

javascript

1const arr = [];

などとし、ループの中で、

javascript

1arr.push("合計金額"+ totalprice + "円")

として要素を追加していき、ループの後で、

javascript

1 $('#totalPrice').append(arr.pop());

とすれば解決です。

調べるまでもないくらいそのままな記述で大丈夫です。

そもそも……

ループの度に出力を追加するコードが記載されていることが問題なのですから、ループを終えた後に一回だけ実行すればOKです。
つまり、

javascript

1while (totalprice <= money) { 2 // ... 省略 ... // 3 $('#result').append("商品名"+ "&nbsp"+ name + "&nbsp" + price + "円" + "<br>"); 4 // $('#totalPrice').append("合計金額"+ totalprice + "円"); 5 // 上の一行を削除 6} 7$('#totalPrice').append("合計金額"+ totalprice + "円"); 8 // ↑代わりにここに記述

とすればOK なはずです。

投稿2019/06/03 12:41

R.Mizukami

総合スコア1086

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

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

Kousukeh10969

2019/06/03 13:05

回答ありがとうございます。 一つ目の配列の指定した方法では無事解決しました。 回答者様の二つ目の方法は実際に試していたのですが、その方法でやるとwhile文の外に記述するため(?)、while文のifの制御構文が効かなくなり、totalprice >moneyという結果になってしまったので、どうしたらよいかということで今回質問させていただきました。
R.Mizukami

2019/06/04 11:42

ああ失礼、見落としておりました。足した後に条件判定をしているので、意図するところと違う結果になるのですね。 二つ目の方法では、足した後の値の条件を確認してから実際に加算する、などの工夫が必要でした。 一つ目の方法でも結果は得られますが、足し合わせる回数が非常に多くなる場合には動作が遅くなり、メモリをがっつり占有するので気を付けてください。
Kousukeh10969

2019/06/06 07:02

なるほど、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問