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

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

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

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

Q&A

2回答

1401閲覧

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

hachii

総合スコア12

JavaScript

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

0グッド

0クリップ

投稿2018/01/10 09:50

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

###現時点でできていること
格納するオブジェクトを3つ用意.

JavaScript

1function Info (x, y,z) { 2 this.x = +x; //オブジェクト 3 this.y = +y; //オブジェクト 4 this.z = +z; //オブジェクト 5} 6 7var str = "9920123A" , infoList = [] , lastIndex = -1; 8while(true){ 9 var x,y; 10 var nextIndex = str.indexOf("20" , lastIndex+1); //20を見つけたら 11 if(nextIndex == -1){ 12 break; //whileループから抜ける 13 }else{ 14 x = str.substr(nextIndex-2 , 2); 15 infoList.push(new Info(x));//格納 16 console.log("x=" + x); 17 18 y = str.substr(nextIndex+2 , 1); 19 infoList.push(new Info(y));//格納 20 console.log("y=" + y); 21 22 z = str.substr(nextIndex+3 , 1); 23 infoList.push(new Info(z));//格納 24 console.log("z=" + z); 25 lastIndex = nextIndex; 26 } 27}

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

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

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

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

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

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

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

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

Lhankor_Mhy

2018/01/10 11:23

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

2018/01/11 00:20

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

2018/01/11 00:50

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

回答2

0

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

javascript

1function Info (x, y,z) { 2 this.x = x; 3 this.y = y; 4 this.z = z; 5} 6var infoList = []; 7infoList.push(new Info("a")); 8infoList.push(new Info("b","c")); 9infoList.push(new Info("d","e","f")); 10console.log(infoList);

this.? = 99

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

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

javascript

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

追記

javascript

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

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

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

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

投稿2018/01/10 10:05

編集2018/01/10 11:30
yambejp

総合スコア114839

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

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

hachii

2018/01/10 10:14

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

2018/01/10 10: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>
hachii

2018/01/10 11:11

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

2018/01/10 11:25

>this.x = +x; //オブジェクト 表記の方法は文字列を「+」でキャスト仕様としています 数値はともかくアルファベットはエラーになりますよ 本文の方に追記しておきますので参考にしてみてください
guest

0

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

js

1var str = "9920123A" , infoList = {} , lastIndex = -1; 2while(true){ 3 var x,y; 4 var nextIndex = str.indexOf("20" , lastIndex+1); //20を見つけたら 5 if(nextIndex == -1){ 6 break; //whileループから抜ける 7 }else{ 8 x = str.substr(nextIndex-2 , 2); 9 infoList.x = +x;//格納 10 console.log("x=" + x); 11 12 y = str.substr(nextIndex+2 , 1); 13 infoList.y = +y;//格納 14 console.log("y=" + y); 15 16 z = str.substr(nextIndex+3 , 1); 17 infoList.z = +z;//格納 18 console.log("z=" + z); 19 lastIndex = nextIndex; 20 } 21} 22 23/* 24{x:99, y:1, z:2} 25*/

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

コメントを受けて追記

js

1var str = "9920123A" , infoList = {} , lastIndex = -1; 2while(true){ 3 var x,y; 4 var nextIndex = str.indexOf("20" , lastIndex+1); //20を見つけたら 5 if(nextIndex == -1){ 6 break; //whileループから抜ける 7 }else{ 8 x = str.substr(nextIndex-2 , 2); 9 infoList.ID = +x;//格納 10 console.log("x=" + x); 11 12 y = str.substr(nextIndex+2 , 1); 13 infoList.1 = +y;//格納 14 console.log("y=" + y); 15 16 z = str.substr(nextIndex+3 , 1); 17 infoList.2 = +z;//格納 18 console.log("z=" + z); 19 lastIndex = nextIndex; 20 21 x = str.substr(nextIndex+4 , 1); 22 infoList.3 = +x;//格納 23 console.log("x=" + x); 24 lastIndex = nextIndex; 25 26 x = str.substr(nextIndex+5 , 1); 27 infoList.4 = +x;//格納 28 console.log("x=" + x); 29 lastIndex = nextIndex; 30 } 31} 32 33/* 34({ID:99, 値1:1, 値2:2, 値3:3, 値4:NaN}) 35*/

投稿2018/01/11 01:00

編集2018/01/11 04:09
Lhankor_Mhy

総合スコア36115

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

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

hachii

2018/01/11 01:18

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

2018/01/11 04:10

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

2018/01/11 11:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問