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

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

ただいまの
回答率

90.99%

  • JavaScript

    13865questions

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

文字列から複数個の文字を抜き出してオブジェクトに格納する

受付中

回答 2

投稿

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

hachii

score 4

実現したいこと

文字列からindexOfで文字探し抜き出し.オブジェクトに格納する.
その際,格納するオブジェクトを5つ以上用意したい.

現時点でできていること

格納するオブジェクトを3つ用意.

function Info (x, y,z) {
  this.x = +x; //オブジェクト
  this.y = +y; //オブジェクト
  this.z = +z; //オブジェクト
}

var str = "9920123A" , infoList = [] , lastIndex = -1;
while(true){
  var x,y;
  var nextIndex = str.indexOf("20" , lastIndex+1); //20を見つけたら
  if(nextIndex == -1){
    break; //whileループから抜ける
  }else{
    x = str.substr(nextIndex-2 , 2);
    infoList.push(new Info(x));//格納
    console.log("x=" + x);

    y = str.substr(nextIndex+2 , 1);
    infoList.push(new Info(y));//格納
    console.log("y=" + y);

    z = str.substr(nextIndex+3 , 1);
    infoList.push(new Info(z));//格納
    console.log("z=" + z);
    lastIndex = nextIndex;
  }
}

問題点

"this"で,.x/.y/.zしか使えない.(3つ以上作ることができない)
最終的に
this.? = 99
this.? = 1
this.? = 2
this.? = 3
this.? = A
といったように格納されるようにしたいです.

※読み込む文字列は必ず半角英数です.

以上,修正箇所等ありましたら連絡の程よろしくお願いいたします.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Lhankor_Mhy

    2018/01/10 20:23

    ご提示のコードを実行すると、infoList は [{x:99, y:NaN, z:NaN}, {x:1, y:NaN, z:NaN}, {x:2, y:NaN, z:NaN}] になるんですが、これは想定している結果ですか?

    キャンセル

  • hachii

    2018/01/11 09:20

    Chromeで見ていますが,x=99 y=1 z=2 と表示されています。

    キャンセル

  • Lhankor_Mhy

    2018/01/11 09:50

    なるほど、関数とオブジェクトについてご理解が足りないようですね…… まず new 演算子などという複雑なものを使わずに、普通に連想配列を使ってみることをおすすめします。

    キャンセル

回答 2

+2

newの使い方に誤解があるのでは?

function Info (x, y,z) {
  this.x = x;
  this.y = y;
  this.z = z;
}
var infoList = []; 
infoList.push(new Info("a"));
infoList.push(new Info("b","c"));
infoList.push(new Info("d","e","f"));
console.log(infoList);

this.? = 99
this.? = 1
this.? = 2
this.? = 3
this.? = A

これはinfoListの配列にキーなしの値をいれるだけでは?
x,y,zのプロパティが必要ならそのプロパティ名を明示的に追加しないといけません。

var str = "9920123A",infoList = [];
var keyword="20";
var reg=new RegExp("(.+)"+keyword+"(.)(.)(.)(.)");
(infoList=str.match(reg)).shift();
console.log(infoList);

 追記

function Info () {
  for(var i=0;i<arguments.length;i++){
    var prop=String.fromCharCode(i+97);
    Object.defineProperty(this,prop,{value:arguments[i]});
  }
}
var info1=new Info("1","23","456","abc","xyz");
console.log(info1);
var info2=new Info("test");
console.log(info2);

なお、ご提示になっている

infoList.push(new Info(x));
infoList.push(new Info(y));

のような書き方ではyと書いてあっても追加されるのは最初の引数である
xに対してです。そのあたりの基本をまずは理解するところからでしょうね

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/10 19:14

    もう少し詳しくしますと,実際のstrは提示しているものと形が異なるため(ログファイルです)indexOfで取得する位置を指定しています.自分としては,this.a,this.bのような感じで,大量のオブジェクトを作成できないのか?ということを思い質問させていただきました.

    キャンセル

  • 2018/01/10 19:23

    前述したとおりオブジェクトのプロパティをいじるには
    任意にプロパティ名を指定してやる必要があります。
    もちろんaから始まりzまでのような処理でいいなら
    順に渡していけばいいでしょう

    <script>
    var hoge={};
    var fuga={};
    for(var i=0;i<26;i++){
    var prop=String.fromCharCode(i+97);
    hoge[prop]="test";
    Object.defineProperty(fuga,prop,{value:"test"});
    }
    console.log(hoge);
    console.log(fuga);
    </script>

    キャンセル

  • 2018/01/10 20:11

    function Info (x, y,z) {
    this.x = +x; //オブジェクト
    this.y = +y; //オブジェクト
    this.z = +z; //オブジェクト
    }
    上記ではx,y,zのみしか使えないということで良いでしょうか?
    自分が理解できている,このような形(fuction ~)で進めたいと思っているのですが...

    キャンセル

  • 2018/01/10 20:25

    >this.x = +x; //オブジェクト

    表記の方法は文字列を「+」でキャスト仕様としています
    数値はともかくアルファベットはエラーになりますよ

    本文の方に追記しておきますので参考にしてみてください

    キャンセル

+1

こういうことでしょうか?

var str = "9920123A" , infoList = {} , lastIndex = -1;
while(true){
  var x,y;
  var nextIndex = str.indexOf("20" , lastIndex+1); //20を見つけたら
  if(nextIndex == -1){
    break; //whileループから抜ける
  }else{
    x = str.substr(nextIndex-2 , 2);
    infoList.x = +x;//格納
    console.log("x=" + x);

    y = str.substr(nextIndex+2 , 1);
    infoList.y = +y;//格納
    console.log("y=" + y);

    z = str.substr(nextIndex+3 , 1);
    infoList.z = +z;//格納
    console.log("z=" + z);
    lastIndex = nextIndex;
  }
}

/*
{x:99, y:1, z:2}
*/


「5つ以上用意したい」とのことですが、キーの名前はどのように決めますか?

 コメントを受けて追記
var str = "9920123A" , infoList = {} , lastIndex = -1;
while(true){
  var x,y;
  var nextIndex = str.indexOf("20" , lastIndex+1); //20を見つけたら
  if(nextIndex == -1){
    break; //whileループから抜ける
  }else{
    x = str.substr(nextIndex-2 , 2);
    infoList.ID = +x;//格納
    console.log("x=" + x);

    y = str.substr(nextIndex+2 , 1);
    infoList.値1 = +y;//格納
    console.log("y=" + y);

    z = str.substr(nextIndex+3 , 1);
    infoList.値2 = +z;//格納
    console.log("z=" + z);
    lastIndex = nextIndex;

    x = str.substr(nextIndex+4 , 1);
    infoList.値3 = +x;//格納
    console.log("x=" + x);
    lastIndex = nextIndex;

    x = str.substr(nextIndex+5 , 1);
    infoList.値4 = +x;//格納
    console.log("x=" + x);
    lastIndex = nextIndex;
  }
}

/*
({ID:99, 値1:1, 値2:2, 値3:3, 値4:NaN})
*/

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/11 10:18

    はい、そうです。
    キーの名前は、id、値1、値2、値3、値4としたいです。

    キャンセル

  • 2018/01/11 13:10

    x とか y とかは何だったんですか……
    追記しました。

    キャンセル

  • 2018/01/11 20:56

    遅くなってしまい申し訳ございません。追記、修正の方にありました連想配列を調べました。
    それを見て自分がやりたいのは、
    infoList = {'id':'99' , '値1':'1' , '値2':'2' '値3':'3' , '値4':'A' }
    みたいな感じです。
    指摘いただいた通り理解が足りていない部分があるため、連想配列を使う方向で行こうと思います。

    キャンセル

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • JavaScript

    13865questions

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