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

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

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

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

Q&A

解決済

3回答

695閲覧

eval()で配列を組み込む

hima-mura.

総合スコア42

JavaScript

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

0グッド

0クリップ

投稿2021/05/24 06:18

編集2021/05/24 06:35
// sample.js let all=[]; let value_num=[[0,1],[1,2]]; for (var i=0;i<2; i++){ // alert('dd' + value_num[i]); eval("var num_" + i +"={" + "x:" + i +"," + "y:" + value_num[i] + "," + // デバックした感じここでエラーを吐いてる "};"); all.push(eval("num_" + i)); } alert(num_0['x']); alert(num_1['y']); alert(all);

変数を生成して(keyに対して)valueに配列を渡したい。"y:" + value_num[i] + ","
を消すと正常に動いたのでここが問題になっていると思われる。
助言をお願いします。

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

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

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

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

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

guest

回答3

0

eval関数の是非はともかく、そのコードがエラーになるのは「配列の文字列化」の処理内容があなたの想定と異なるからです。

生成した文字列を直接evalせず、一度変数に代入して中身をチェックすればなぜエラーになるか容易に分かります。そのようなチェックの手間を惜しんではいけません。

"y:" + value_num[i] + ","

ここで、value_num[i] を文字列として出力しています。これは value_num[i].toString()が暗黙に呼び出されます。
Array.toString()は「配列の中身を単純にカンマで区切った内容」が出力されます。ドキュメントにちゃんと明示されています。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/toString

配列を表現する[ ] はtoString()では出力されません。

それでは解決方法はどうなのかというと、JSON.stringifyメソッドを通すとJSONで扱うような表現で文字列が出力されます。 JSON.stringify(value_num[i])の出力結果を確認しましょう。

まあ、とにかくevalする前に一度変数に代入し、内容をチェックするのが確実です。
(大切なので2回言いました)

おそらく、じゃあconsole.logで出てくる文字列は何なんだ、という疑問がわいてくると思います。私も内部の細かな挙動は詳しくないですが、console.logの内部で同じようにJSON.Stringifyが呼ばれているのであろうと思われます。
(違ってたら申し訳ない)

検証コード:

javascript

1var value_num = [[0,1],[1,2]]; 2console.log("console.log(value_num[0]): ",value_num[0]); 3console.log("console.log(value_num[0].toString()): ",value_num[0].toString()); 4console.log("console.log(JSON.stringify(value_num[0])): ",JSON.stringify(value_num[0])); 5var i = 0; 6 7var evalStr1 = "var val_" + i + "={" + "x:" + i + "," + "y:" + value_num[i] + "," + "};"; // これは不正な構文になる 8i++; 9evalStr2 = "var val_" + i + "={" + "x:" + i + "," + "y:" + JSON.stringify(value_num[i]) + "," + "};"; // これは正常な構文になる 10 11console.log("evalStr1: ", evalStr1); 12console.log("evalStr2: ", evalStr2); 13 14//eval(evalStr1); 15eval(evalStr2); 16 17//console.log(val_0); 18console.log(val_1);

投稿2021/05/24 07:05

hope_mucci

総合スコア4447

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

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

hima-mura.

2021/05/25 17:10

JSで配列を扱うとき、たびたび想像と異なる値がはじかれることがありましたが、toString()の仕業だったわけですね。stringifyメソッドの存在を知らなかったのでありがたいです。大変参考になりました。
guest

0

ベストアンサー

エラー(どんなエラー?)が出るのは "y:" + value_num[i] + ","value_num[i] の部分が期待している形式ではないからです。 // alert('dd' + value_num[i]); で確認しているので期待と違うことは理解したのでは?

eval()はできだけ避けましょう。以下のようのコードが本当にしたかったことなのでは。

js

1let all = value_num.map((item, i) => { return {x:i, y:item};}); 2alert(all[0].x); 3alert(all[1].y); 4alert(all);

投稿2021/05/24 06:40

int32_t

総合スコア21008

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

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

hima-mura.

2021/05/24 07:03

map()使い勝手がよいですね。大変参考になりました。 ありがとうございます。
guest

0

なにをしたいのか分かりづらいのと、evalを使うのは関心できないことをおいておいて

javascript

1let all=[]; 2let value_num=[[0,1],[1,2]]; 3for (var i=0;i<2; i++){ 4 var str="var num_" + i +"={" + 5 "x:" + value_num[i][0]+"," + 6 "y:" + value_num[i][1]+ 7 "};"; 8 eval(str); 9 all.push(eval("num_" + i)); 10} 11console.log(num_0['x']); 12console.log(num_1['y']); 13console.log(all);

投稿2021/05/24 06:41

yambejp

総合スコア115010

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

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

hima-mura.

2021/05/24 06:59

やりたいことが不透明ですいません。変数の自動生成で調べたらeval()が出てきたのでそのまま使おうとしてました。確かにリスクが多いみたいなので、使わないようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問