• ベストアンサー

JScript 連想配列の動的宣言

JScriptです。 連想配列でmap?の様に宣言する場合、 定数で無いと正しく処理されない様なのですが、 動的に宣言する方法はないでしょうか? var mymap = []; // 引数は予測できない為動的 var myarg = WScript.Arguments; mymap = ['myarg(0)': 0]; WScript.Echo(mymap['myarg(0)']); // 結果は空白である

質問者が選んだベストアンサー

  • ベストアンサー
  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.5

'myarg(0)'は、「myarg(0)」という文字列リテラルなので定数です。 なので、 var mymap = {'myarg(0)': 0}; WScript.Echo(mymap['myarg(0)']); で0を出力することができます。 ただ、質問文を見る限りkeyに使いたかったのは 'myarg(0)'ではなくmyarg(0)のようなので、 その場合は以下のように書けば良いです。 var mymap = {}; var myarg = WScript.Arguments; mymap[myarg(0)] = 0; WScript.Echo(mymap[myarg(0)]);

popepon
質問者

お礼

あーなるほど var mymap = {'myarg(0)': 0}; を mymap = ['myarg(0)': 0]; と中括弧と大括弧を間違えた為意図した動作にならなかったんですね。 修正した所上手くいきました。ありがとうございました。 意図としては'myarg(0)'です。

その他の回答 (4)

回答No.4

>回答No.3 amanojaku1 >もしかして、WScript.Argumentsの配列要素の個々に連想配列の任意のキーを付けて連想配列に格納したいと言う事でしょうか? >例えばWScript.Argumentsの配列要素が2つ有ったとしてWScript.Arguments(0)の配列要素には「'myarg(0)'」と言うキー、WScript.Arguments(1)の配列要素には「'myarg(1)'」と言うキーを付けて連想配列に格納したいと言う事でしょうか? もし、そうなら下記のようになります。 var mymap = new Array(); for (i = 0; i < WScript.Arguments.length; i++){ key = "myarg("+i+")"; mymap[key] = WScript.Arguments(i); WScript.Echo("<"+key+">:"+mymap[key]); }

popepon
質問者

お礼

ご回答頂き有難う御座います。 〉WScript.Argumentsの配列要素の個々に連想配列の任意のキーを付けて連想配列に格納したいと言う事でしょうか? myargで取得した引数をキーにして、別の値を格納したいと言うことです。 自分が最初書いた例だと期待するべき戻り値は 0 です 受け取った引数をキーにする感じです。

回答No.3

>引数を渡したmyargで配列の番地を設定したい >と言う質問なのですがその御回答で間違いないでしょうか? 意味が良く分かりません。 もしかして、WScript.Argumentsの配列要素の個々に連想配列の任意のキーを付けて連想配列に格納したいと言う事でしょうか? 例えばWScript.Argumentsの配列要素が2つ有ったとしてWScript.Arguments(0)の配列要素には「'myarg(0)'」と言うキー、WScript.Arguments(1)の配列要素には「'myarg(1)'」と言うキーを付けて連想配列に格納したいと言う事でしょうか?

回答No.2

>回答No.1 amanojaku1 >「mymap['myarg(0)'](0)」はゼロ・スタートです、ゼロが1個目です。 分かりにくいかもしれないので加筆します。 「WScript.Echo(mymap['myarg(0)'](0))」の「mymap['myarg(0)'](0)」はゼロ・スタートです、ゼロが1個目です、1個目だけ表示しています。

回答No.1

WSH(Windows Script Host)のJavaScriptですね、WSHは良く知りませんが…。 (実行する場合)コマンドラインでパラメーターを記述する必要があります。 「mymap['myarg(0)'](0)」はゼロ・スタートです、ゼロが1個目です。 「for (i = 0; i < mymap['myarg(0)'].length; i++)」はゼロからスタートして、個数分を表示します」。 mymap = {"myarg(0)":WScript.Arguments}; WScript.Echo(mymap['myarg(0)'](0)); for (i = 0; i < mymap['myarg(0)'].length; i++){ WScript.Echo("No.<"+i+">:"+mymap['myarg(0)'](i)); }

popepon
質問者

お礼

御回答頂き有難う御座います。 こちらの勘違いで無ければ質問の意図が伝わらなかった様です。 引数を渡したmyargの値を取得したいのではなく 引数を渡したmyargで配列の番地を設定したい と言う質問なのですがその御回答で間違いないでしょうか?

関連するQ&A

  • 配列や連想配列について

    言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CodeIgniter/フォームで連想配列

    CodeIgniter/フォーム form_checkbox() で連想配列を渡すときの引数(追加データの渡し方)が分からないので、教えてください。 >form_checkbox() >追加データを設定したい場合は、 第4引数にそれを文字列として渡すことができます: >echo form_checkbox('newsletter', 'accept', TRUE, $js) と書かれているのですが、連想配列を利用してかつ追加データも渡したいときは、どうなるのでしょうか? $data = array(   'name'    => 'newsletter',   'id'     => 'newsletter',   'value'    => 'accept',   'checked'   => TRUE,   'style'    => 'margin:10px',   ); $js = 'onClick="some_function()"'; echo form_checkbox($data, '', TRUE, $js) それとも、 echo form_checkbox($data, TRUE, $js) それとも、 echo form_checkbox($data, $js) ▽フォームヘルパー:CodeIgniter ユーザガイド 日本語版   http://codeigniter.jp/user_guide_ja/helpers/form_helper.html

    • ベストアンサー
    • PHP
  • javascript 連想配列

    初めて連想配列で処理を行っております。いろいろグーグル等で調べましたが、どうしてもできないので、ご教授頂けますでしょうか。 phpからjavascriptにデータを渡し、連想配列化する必要がありまして、以下の通りにやってみました。配列化は自動化したく、for文でこのようにしてみました。phpの大部分は少々長いので省きますが、ざっとこんな感じです。 var place = <?PHP echo $place ?>; //東京、大阪、名古屋 var address = <?PHP echo $add ?>; //東京都、大阪府、名古屋市 var Data = new Array();   for(i=0;i<place.length;i++){ Data[i].push({add1:place[i] , add2:address[i]});   } alert(Data[0]); ------------------------------- 上記の方法ですと、placeとaddressには正しく値はphpから渡されるのですが、肝心なDataはなにも出力されません。エラーもなく、まっさらです。 理想系は、以下の方法の通りにしたいと思っております。 下記はフリーウェアの中身を今回の案件に手直ししたものです。 Data = [{  add1: "東京",  add2: "東京都" }, {  add1: "大阪",  add2: "大阪府" }, {  add1: "名古屋",  add2: "名古屋市" }]; この場合と同じ結果が出力されれば完成なのですが・・・ 例えば、Data[0]をalertすると、「object object」と出力されます。 現在は3件で開発を行っておりますが、今後はどんどん増えていくので、自動化させるためにfor文か、for in文を使ったほうがいいのかな と思っているのですが、力及ばず詰まっております。 どうかお助けください。 よろしくお願い致します。

  • JScriptでExcelの全シートにアクセスする方法

    JScriptからWSHを使って、Excelファイル内の全ワークシートにアクセスしようと試みています。たとえば、 var excel=WScript.CreateObject("Excel.Application"); excel.Visible=false; book=excel.Application.Workbooks.Open(ファイル名); for(var sheet in book.Sheets) { WScript.Echo(sheet.Name); } と書いてみましたが、forループに入りません。 VBScriptでは上記のようなコードでOKらしいのですが、JScriptではNGなのでしょうか? また、Office製品のActiveXオブジェクト(というのかどうかよくわからないのですが)を詳しく紹介しているサイトや書籍などをご存知でしたら教えてください。 MicrosoftのサイトにはTIPS程度しか載っていないので、独習できない状況です。

  • 関数とarguments配列

    ●質問の主旨 下記サイト、CodeStudyによる JavaScriptの関数とarguments配列の 使い方に関する問題に対する 答えとなるコードの記述が分かりません。 どなたかアドバイスをお願いします。 CodeStudy 関数その2 3.arguments その3 http://jeek.jp/study/section18/3 ●問題文 関数checkが定義されています。 check内のif文により、引数が3つ以外の際は、 outputで"引数が3つではありません。"と出力させましょう。 function check(x, y, z) { if() { output("引数が3つではありません。"); } } check(1, 2, 3, 4); ●自分で作った途中経過 resultやreturnの使い方がよく分かりません。 function check(x, y, z) {  var result = 0; if(arguments.length !== 3) { output("引数が3つではありません。"); } return result; } check(1, 2, 3, 4); output(check); ●コードの条件(ヒント) argumentsは、引数を格納する配列で、 argumentsを使うと引数をいくつでもとることが出来ます。 また、argumentsは配列なので、 .lengthを使うと長さが求められます。

  • jscriptで空白を含む文字列の引数が途切れる

    abc.batから user01.js "A01 B01" "X01" として実行したとき ----------------------------------- user01.jsでは、 var objArg = WScript.Arguments; var arg01,arg02; arg01= objArg.item(0); arg02= objArg.item(1);  が実行され arg01は、"A01" arg02は、"B01" となります 期待しているのは arg01は、"A01 B01" arg02は、"X01"       です デリミッタが空白なので何か問題があるのでしょうが・・・わかりません お知恵をお願いします

  • VBAのJScriptのeval()の挙動について

    VBAのコードを調べていますが、 JScriptで記述されている部分があり、 この部分でよく分からない挙動があるので教えてください。 (JSONデータをパースしているコードです) 具体的には、(実際のコードを簡略化したもの) ---------------------------------------- Sub test() Dim x As String Dim sc As Variant Dim y As String x = "{""A"":""d"",""B"":""e"",""C"":""f""}" Set sc = json_perse(x) y = sc.CodeObject.getValue("B") Debug.Print y End Sub Public Function json_perse(ByVal x As String) As Variant Dim sc As Object Set sc = CreateObject("ScriptControl") With sc .Language = "JScript" .AddCode "function getValue(){ var $tmp=''; for(var $i = 0; $i < arguments.length; $i++){ $tmp += ""['"" + arguments[$i] + ""']""; } return eval('e' + $tmp); }" .AddCode "var e = eval(" & x & ");" End With Set json_perse = sc End Function ------------------------------------------ のコードを実行すると、 getValue()の引数で指定した文字列(ここではB) の後の:の後の文字(ここではe)が返されますが、 なぜ、このようになるのかがよく分かりません。 この処理をしている部分を抽出すると ------------------------------------- function getValue(){  var $tmp='';  for(var $i = 0; $i < arguments.length; $i++){  $tmp += ""['"" + arguments[$i] + ""']"";  }  return eval('e' + $tmp); } var e = eval(" & x & "); ------------------------------------- となっていて、 eval()は、文字列として指定されたコードをJavaScriptのコードとして評価する ということですが、 eval(" & x & ")とeval('e' + $tmp)の部分が何をしているのかがよく分かりません。 なぜ、このコードを実行すると、 $tmpの文字(この場合はB)の後の:の後にある値が取得できるのでしょうか。

  • 2次元連想配列配列の使用方法

    こんばんは。 次のような配列 "http://www.yahoo.co.jp", "Yahoo!" "http://www.google.co.jp", "google" (...以下同様...) で aryLink[0]["URL"] → "http://www.yahoo.co.jp" aryLink[1]["Text"] → "google" というように参照できるようにしたいのですが 下記のスクリプトで「'aryLink[...]'はまたはオブジェクトではありません」というエラーになってしまいます。 どうすればよいのでしょうか?教えてください。 よろしくお願いします。 -- var DEBUG=1; aryLink = new Array(2); for (i = 0; i < aryLink.length; i++) { aryLink[i] = new Array(); } var IE = WScript.CreateObject("InternetExplorer.Application"); IE.Navigate("http://www.yahoo.co.jp"); while(IE.busy); while(IE.Document.readyState != "complete"); var objTagsAs = IE.Document.all.tags("A"); if(DEBUG) { for (i = 0; i < 5; i++) { WScript.Echo(objTagsAs[i] + "," + objTagsAs[i].innerText); } } for (i = 0; i < objTagsAs.length; i++) { aryLink[i]["URL"] = String(objTagsAs[i]) aryLink[i]["Text"] = String(objTagsAs[i].innerText); }

  • 配列の要素数に変数を入れたいときには

    よろしくお願いします。 配列の要素数には定数しか入れられないのですが,どうしても変数を入れたいときは,それを引数として関数を呼び出すしか方法はないでしょうか。 具体的には,scanfで手に入れたint型の変数を要素数とする配列を宣言したいのですが,どうすれば良いでしょうか。 ご教授ください。

  • WSH .TargetPath 中の /

    JScript です。 CreateShortcutプロパティのTargetPathを指定する際、 引数など渡す為のコマンドラインを含ませようとする場合 スラッシュを期待するものが実際には¥に置き換わってしまいます。 明示的にスラッシュを指定する事は出来るでしょうか? var objSh = WScript.CreateObject("WScript.Shell"); var sc = objSh.CreateShortcut("C:\\test.lnk"); sc.TargetPath = "C:\\test.exe \/m" など、/m で引数で渡そうとすると WScript.Echoなどでは正しく/mと表示されますが 実際のショートカットでは¥mと表示されてしまいます。 指定する方法はありますでしょうか? あと"C:\\test.exe \”C:\\test.exe\"" などの渡し方もエラーになってしまいます。 どの様に記述すべきでしょうか

専門家に質問してみよう