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

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

ただいまの
回答率

91.36%

  • JavaScript

    11189questions

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

Javascript:構造体

解決済

回答 3

投稿 2017/11/20 21:31 ・編集 2017/11/20 23:24

  • 評価
  • クリップ 0
  • VIEW 347

yu-kos

score 2

実現したいこと

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

    <script type="text/javascript">
      var Info=function(){
      this.x=0;
      this.y=0;
      };
      var data=[10,20,30,10,40,50];
      var info=[];
      var cnt=0;
      for(var i=0;i<=data.length;i++){
        if(data[i]==10){
          cnt=cnt+1;
        for(var j=0;j<=cnt;j++){
          info[j]=new Info();
          info[j].x=data[i+1];
          info[j].y=data[i+2];
          console.log(info[j].x);
          console.log(info[j].y);
        }
      }
    }
    </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質問文一部訂正しました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

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

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

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

 for 文 (訂正前)

var data = [10,20,30,10,40,50], set = [];

for (var i = 0, len = data.length, value; i < len; ++i) {
  value = data[i];

  if (!set.includes(value)) {
    set.push(value);
    console.log(value);
  }
}

console.log(JSON.stringify(set)); // [10,20,30,40,50]

 new Set() (訂正前)

var data = [10,20,30,10,40,50],
    set = new Set(data);

for (var value of set) {
  console.log(value);
}

console.log(JSON.stringify([...set]));  // [10,20,30,40,50]

 改善案

function Info (x, y) {
  this.x = +x;
  this.y = +y;
}

var data = [10,20,30,10,40,50], infoList = [];

for (var i = 0, len = data.length, x, y; i < len; ++i) {
  if (data[i] === 10) {
    x = data[i + 1];
    y = data[i + 2];
    infoList.push(new Info(x, y));
    console.log(x);
    console.log(y);
  }
}

console.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 22:32

編集 2017/11/20 23:56

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/21 19:54

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

    キャンセル

  • 2017/11/22 12:15

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

    キャンセル

  • 2017/11/22 12:27

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

    キャンセル

+2

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

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

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

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

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

var Info = function(){
  this.x = 0;
  this.y = 0;
};
var data = [10,20,30,10,40,50];
var infos = [];
data.forEach(function(n,i,arr){
  if(n == 10){
    var info = new Info();
    info.x = arr[i+1];
    info.y = arr[i+2];
    infos.push(info);
  }
});
infos.forEach(function(info){
  console.log(info.x);
  console.log(info.y);
  // console.log("x : " + info.x + " , y : " + info.y);
});

出力

20
30
40
50

投稿 2017/11/20 22:10

編集 2017/11/21 02:17

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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


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

例:

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

投稿 2017/11/20 22:14

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • JavaScript

    11189questions

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