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

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

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

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

Q&A

解決済

3回答

399閲覧

Javascript:構造体

yu-kos

総合スコア8

JavaScript

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

0グッド

0クリップ

投稿2017/11/20 12:31

編集2017/11/20 14:24

###実現したいこと
dataの中から10を見つけた時に、構造体(?)に格納し画面に表示する。

javascript

1 <script type="text/javascript"> 2 var Info=function(){ 3 this.x=0; 4 this.y=0; 5 }; 6 var data=[10,20,30,10,40,50]; 7 var info=[]; 8 var cnt=0; 9 for(var i=0;i<=data.length;i++){ 10 if(data[i]==10){ 11 cnt=cnt+1; 12 for(var j=0;j<=cnt;j++){ 13 info[j]=new Info(); 14 info[j].x=data[i+1]; 15 info[j].y=data[i+2]; 16 console.log(info[j].x); 17 console.log(info[j].y); 18 } 19 } 20 } 21 </script>

###理想の完成形
以下のように格納され、表示できること。
20//info[0].x
30//info[0].y
40//info[1].x
50//info[1].y
###現在の表示
20
30
20
30
40
50
40
50
40
50
###コメント
ループのどこが間違えているのでしょうか。いまだに分かりません・・・。
また、今回使用しているものは構造体と呼んでよいのでしょうか?
以上、ご教示の程よろしくお願いします。
※11/20 23:24質問文一部訂正しました。

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

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

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

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

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

guest

回答3

0

ベストアンサー

詳細な要件が不明なので、「理想の完成形」を実現する方法のみに言及しています。

(2017/11/20 23:54 追記)

質問の編集を受けて、要件が理解できた為、改善案を追記しました。

for 文 (訂正前)

JavaScript

1var data = [10,20,30,10,40,50], set = []; 2 3for (var i = 0, len = data.length, value; i < len; ++i) { 4 value = data[i]; 5 6 if (!set.includes(value)) { 7 set.push(value); 8 console.log(value); 9 } 10} 11 12console.log(JSON.stringify(set)); // [10,20,30,40,50]

new Set() (訂正前)

JavaScript

1var data = [10,20,30,10,40,50], 2 set = new Set(data); 3 4for (var value of set) { 5 console.log(value); 6} 7 8console.log(JSON.stringify([...set])); // [10,20,30,40,50]

改善案

JavaScript

1function Info (x, y) { 2 this.x = +x; 3 this.y = +y; 4} 5 6var data = [10,20,30,10,40,50], infoList = []; 7 8for (var i = 0, len = data.length, x, y; i < len; ++i) { 9 if (data[i] === 10) { 10 x = data[i + 1]; 11 y = data[i + 2]; 12 infoList.push(new Info(x, y)); 13 console.log(x); 14 console.log(y); 15 } 16} 17 18console.log(JSON.stringify(infoList)); // [{"x":20,"y":30},{"x":40,"y":50}]

また、今回使用しているものは構造体と呼んでよいのでしょうか?

JavaScriptに「構造体」は存在しません。
new Info は単純なオブジェクトですね。

更新履歴

  • 2017/11/20 23:54 改善案を追記

Re: yu-kos さん

投稿2017/11/20 13:32

編集2017/11/20 14:56
think49

総合スコア18162

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

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

yu-kos

2017/11/21 10:54

改善案を使い、無事自分の思っている動作を確認できました。 オブジェクトというのですね。勉強になります。 一つ質問なのですが、this.x=+x; の+xはどのような意味ですか? お時間ありましたらよろしくお願いします。
think49

2017/11/22 03:15

+x は Number 型へ変換します(Number(x) と同じ動作)。 x値, y 値にNumber型を期待しているように読めた為、型変換処理を入れました。。
think49

2017/11/22 03:27

後で気が付きましたが、「改善案」は一度参照した要素にも反復処理してしまう問題があるので、下記コードに直すといいですね。 x = data[++i]; y = data[++i]; data = [10,10,10,10,10,10] の処理結果を確認すれば、違いが分かります。
guest

0

仕様があまりわかりませんが、

JavaScript

1 cnt=cnt+1; 2 for(var j=0;j<=cnt;j++){

これ必要?
&iのforにおいて10が見つかったときにi+2までデータ使ってるから、i+2してから次のループしにしないと行けないような。

例:

JavaScript

1 <script type="text/javascript"> 2 var data=[10,20,30,10,40,50]; 3 var info=[]; 4 for(var i=0;i<=data.length;i++){ 5 if(data[i]==10){ 6 var wk={x: data[i+1], y:data[i+2]}; 7 console.log(wk.x); 8 console.log(wk.y); 9 info.push(wk); 10 } 11 } 12 console.log(info); 13 </script>

投稿2017/11/20 13:14

rururu3

総合スコア5545

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

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

0

javascript

1for(var j=0;j<=cnt;j++){ 2 info[j]=new Info(); 3 info[j].x=data[i+1]; 4 info[j].y=data[i+2]; 5 console.log(info[j].x); 6 console.log(info[j].y); 7}

ここで下手にcntを使っているのが原因ですね。

  • 1回目に10を見つけた時 -> cnt = 1 -> j = 0なので、1になるまでの2回繰り返し -> logが2
  • 2回目に10を見つけた時 -> cnt = 2 -> j = 0なので、2になるまでの3回繰り返し -> logが3

一回cntから離れて考えてみてはどうでしょうか?

私も作ってみましたけど、forEachを使うという、forを使う人から見ればある意味ズルい?ことをしてみました。参考までに。

javascript

1var Info = function(){ 2 this.x = 0; 3 this.y = 0; 4}; 5var data = [10,20,30,10,40,50]; 6var infos = []; 7data.forEach(function(n,i,arr){ 8 if(n == 10){ 9 var info = new Info(); 10 info.x = arr[i+1]; 11 info.y = arr[i+2]; 12 infos.push(info); 13 } 14}); 15infos.forEach(function(info){ 16 console.log(info.x); 17 console.log(info.y); 18 // console.log("x : " + info.x + " , y : " + info.y); 19});

出力

20 30 40 50

投稿2017/11/20 13:10

編集2017/11/20 17:17
namnium1125

総合スコア2043

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問