多次元配列のkeyをカウントUPしながら取得したい

このQ&Aのポイント
  • 多次元配列のkeyをカウントアップしながら値を取得する方法について質問です。
  • 現在はfor文を使用して個別に取得しているため冗長な記述になっています。
  • よりスマートな方法で多次元配列の値を取得する方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

多次元配列のkeyをカウントUPしながら取得したい

お世話になります。 for文をその分記述すれば、得たい値は取得できるのですが、スマートではない為、多次元配列のkeyをカウントアップしながら取得できれば・・・と、ハマってます。 どのように記述すれば可能でしょうか。 callback({ "IMG" : [ { "src" : { "url1" : "http://domain.com/", "url2" : "http://domain.com/", "url3" : "http://domain.com/" } }, { "src" : { "url1" : "http://domain.com/", "url2" : "http://domain.com/", "url3" : "http://domain.com/" } }, { "src" : { "url1" : "http://domain.com/", "url2" : "http://domain.com/", "url3" : "http://domain.com/" } } ] } ); $(function(){ $.ajax({ type: 'GET', url: './jsonp.js?callback=?', dataType: 'jsonp', jsonpCallback: 'callback', success: function(data){ str = $('<ul id="tiles"></ul>'); /*下記のやり方で取得可能ですが、物凄く冗長な為、簡素に記述したいのです for (var i in data.IMG) { var imgsrc = data.IMG[i].src.url1; alert( "imgsrc="+imgsrc ); } for (var i in data.IMG) { var imgsrc = data.IMG[i].src.url2; alert( "imgsrc="+imgsrc ); } for (var i in data.IMG) { var imgsrc = data.IMG[i].src.url3; alert( "imgsrc="+imgsrc ); } */ var ary=new Array(1,2,3); for(n in ary) { for (var i in data.IMG) { var url = 'url'+n; var imgsrc = data.IMG[i].src.url; alert( "url="+url ); } } }); }); どなた様かご教授戴けますようお願い致します。

  • taku0
  • お礼率80% (160/199)

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

eval使うとか・・・・。 /*下記のやり方で取得可能ですが、物凄く冗長な為、簡素に記述したいのです for (var i in data.IMG) { var imgsrc = data.IMG[i].src.url1; alert( "imgsrc="+imgsrc ); } for (var i in data.IMG) { var imgsrc = data.IMG[i].src.url2; alert( "imgsrc="+imgsrc ); } for (var i in data.IMG) { var imgsrc = data.IMG[i].src.url3; alert( "imgsrc="+imgsrc ); } */ ↓ for (var i in data.IMG) { for (var j = 1; j <= 3; j++) { var imgsrc = eval("data.IMG[i].src.url" + j); alert( "imgsrc="+imgsrc ); } } 試してないけど。

taku0
質問者

お礼

ばっちりいけました。 evalでできるんですね。勉強になりました。 ありがとうございます。

その他の回答 (2)

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.3

少々難解になりますが、関数型プログラミングっぽい記述は如何でしょう function getUrl(pname){ return function(img){return img.src[pname]} } function process(url){ alert('imgsrc=' + url); } // IMG の配列 → 特定プロパティ値の配列 → 配列内容で繰り返し処理 data.IMG.map(getUrl('url1')).forEach(process); data.IMG.map(getUrl('url2')).forEach(process); data.IMG.map(getUrl('url3')).forEach(process);

taku0
質問者

お礼

関数型っぽい記述の事例ありがとうございます。 記述を良く良くみて調べてみますと、 map演算子で配列を操作するforEachに関数を渡す。 という感じなんですかね。。 IMGのsrc以外に受け取りたい値が2つの場合、3つの場合、と増えていった際、受け渡しの記述が大変になりました。そして得たい値が表示できない。というエラーになり、今回はひとまず深追いしないでおきます。 また一つ視野が広がりました。ご教授頂きありがとうございます。 また何か機会ありましたら宜しくお願い致します。

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

var ary=["url1","url2","url3"]; for(j in ary) {  for (var i in data.IMG) {   var imgsrc = data.IMG[i].src[ ary[j] ];   alert( "url="+ary[j] );  } } こんな感じ。 JavaScriptはオブジェクトのプロパティアクセスを連想配列で実現していて obj.prop と obj["prop"] は同じです。 (後者なら"prop"は変数でも良い。)

taku0
質問者

お礼

obj.propとobj["prop"]が同じで、後者は中を変数でもOKという事。 事例を交えて教えて頂きありがとうございます。 複数の値を取得する際も予め配列として設定しておくことで同じように取得することも確認できました。 勉強になりました。ありがとうございます。

関連するQ&A

  • 多次元配列がさっぱりです。

    var img = ["test01.jpg", "test02.jpg", "test03.jpg", "test04.jpg"]; var name = ["テスト1", "テスト2", "テスト3", "テスト4"]; for (var i = 0; i < img.length; i ++) { document.write('<img src="../img/' + (img[i]) + '" width="132" height="160" border="0" />' + '<br />'); for (var j = 0; j < name.length; j ++){ document.write((name[j])); } } 全然駄目です・・・ 画像があって、画像の下に var name を表示したいんですが、分かりませんでした。分かるかた、教えてください!

  • Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。

    Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。 var data = [ [1,2,3], [4,5,6], [7,8,9] ]; for (var i = 0; i < data.length; i++){ for (var j = 0; j < data[i].length; j++){ <--- ここで lengthのオブジェクトがNullというエラーになります。 alert(data[i][j]); } } よろしくお願いいたします。

  • xmlから配列で取得したものを取り出したい

    as3初心者jpncan15といいます。 xmlから配列で取得したものをfunction外で取り出したいのですがどのようにすればいいのか悩んでいます。functionを調べたり配列を調べたり頭がかなり混乱中です。 お手数ですがご教授いただけますでしょうか? var ary:Array=new Array(); var ary_name:Array=new Array(); var loader:URLLoader = new URLLoader(); var request:URLRequest = new URLRequest("b.xml"); var xml:XML; loader.load(request); loader.addEventListener(Event.COMPLETE , XMLload); function XMLload(e:Event):void { xml = XML(e.target.data); num_txt.text = xml.item.length(); //xml件数をテキストフィールドへ入れる for each(var element:Object in xml.item.thumb) //配列に入れる {ary.push(element);} for each(var element_name:Object in xml.item.name) //配列に入れる {ary_name.push(element_name); trace(element_name);}//出力OK } //function外で配列を使用したい trace(ary[5]); trace(ary_name[2]);

    • ベストアンサー
    • Flash
  • JSONPでのおかしな挙動

    最近Ajaxの勉強を始めたものです。 クロスドメインでの通信を行うため、レンタルサーバー2個(ドメイン2個) の環境で、JSONPを使って下記のようなコードを記述したところ、無事に 動作が確認できました。 ●HTML(ドメイン1) <html> <head> <title>JSONPテスト</title> <script type="text/javascript"> function callback(data) { contents = "姓: " + data.sei + " 名: " + data.mei; alert(document.getElementById('here').innerHTML); //初期値です document.getElementById('here').innerHTML = contents; } var url = "ドメイン2のURL/callback.js"; var script = document.createElement('script'); script.setAttribute('src', url); document.getElementsByTagName('head')[0].appendChild(script); </script> </head> <body> <div id="here">初期値です</div> </body> </html> ●callback.js(ドメイン2) callback({"sei": "山田", "mei": "太郎"}); ところが、上記のドメイン1の代わりにブログを使い、ドメイン2 としてレンタルサーバーでテストしたところ、 document.getElementById("here") is null というエラーが出てしまいます。 ブログとしては、SeesaaとFC2を利用したところ、どちらもNGでした。 alertで変数をチェックしたところ、本来「初期値です」というテキスト が表示されるはずのところが、nullになっており、どうも該当タグが DOMで認識されていないようです。 一方で、同じく無料ブログにおいて、単純に、 <script type="text/javascript"> alert(document.getElementById('here').innerHTML); //初期値です </script> のみを実行すると、こちらはうまくいくのです。 関数での変数のスコープの問題かとも思いますが、どうにも理解でき なくて困っています。 アドバイスをよろしくお願いいたします。

    • ベストアンサー
    • AJAX
  • 配列からNULL以外のキーを取得したいのですが……

    配列からNULL以外のキーを取得したいです。 [0, 3]を期待しているのに、[0, 3: 3] で返ってきます。 なんででしょうか? function test(data) {  var result = [];  for (var i = 0, l = data.length; i < l; i++) {   if(data[i] !== null){    result[i] = i;   }  }  return result; } var data = ["1", null, null, "5"]; var last = test(data); console.log(last); ・console.logだから? ・もしそうなら、どうして[ 0: 1, 3: 3] ではないのでしょうか?

  • Javascriptの修正がわかりません

    ルート「/」からの設定をkaitoフォルダー「/kaito/」に変更したいのですが、どこを修正すればいいのかわかりません。 $(function () { var url = location.pathname ; var ary = url.split("/"); while ( ary.length >= 3 ) { ary.pop(); } var str = ary.join("/")+"/"; if ( str == "//" ) str = "/"; var target = $("#gnav ul").children("li").children('a[href="'+str+'"]'); if ( target.length <= 0 ) return ; var imgPath = target.children("img").attr("src"); target.children("img").attr("src",imgPath.replace( /_o(\.[a-z]+)$/, "_a"+"$1")); });

  • ○○.srcだとNetscapeで取得できない

    JavaScriptで画像のプリロードをさせています。 ソースは以下の通りです。 window.onload = function() { for( i = 0 ; i <= 8 ; i++ ){ img[i] = new Image(); img[i].src = (略); } } (略)とした部分では、ファイルアドレスを動的に作成しています。今のところNetscape以外のブラウザではうまく動作していますが、Netscapeではその後の処理が遅く、プリロードが出来ていないんじゃないのかと思って調べてみるとその通りでした。 問題点は、「変数名.src」となっているとその値を取得できていないということでした。例えば上のソースですと、「img[i].src」では値を取得できませんが「img[i]」であれば取得できていました。しかし後者ですとプリロードが出来ないため、従来どおり前者を使わなくてはいけないようです。「変数名.src」の値をNetscapeで取得するにはどのようにしたら良いのでしょうか? 例: hensuu = "変数"; alert(hensuu); //"変数"がアラートで出力される。 hensuu.src = "変数"; alert(hensuu.src);//アラートが出ない。

  • Jsonpのコールバック関数に内に引数を渡すには?

    APIで返されたJsonpコールバック関数に引数を渡したいのですが、やり方が判りません。 それともそもそも、間違っていて 1.引数を渡さない 2.コールバック関数内のデータを一旦変数にいれてコールバック関数内から取り出す。 3. 2で取り出したコールバック関数内のデータと1で渡そうとしていた引数を使う。 とやったほうがいいのでしょうか。 当方経験が浅いためよくわかっていません。基本的な間違いの可能性が高いと思います。 識者の方ご教授下さい。お願いします。 function start(){ var str = "渡したい引数"; var param = new Object(); param.keyword = '東京'; param.inputcharset = 'utf8'; param.outputcharset = 'utf8'; param.format = 'jsonp'; param.callback = 'jsonp4travelAPI'; var url = 'http://api.4travel.jp/Ver1/SearchAlbum.php?'+obj2query( param ); // script 要素の発行//ここでAPIへリクエストを送る。 var script = document.createElement( 'script' ); script.type = 'text/javascript'; script.src = url; document.body.appendChild( script ); } // 4travel検索終了後のコールバック関数 function jsonp4travelAPI ( data ) { // データが取得できているかチェック // //ここに渡したい引数も持ってきたい。でも str is not definedになります。 alert(str); } // オブジェクトからクエリー文字列を生成する関数 function obj2query ( obj ) { var list = []; for( var key in obj ) { var k = encodeURIComponent(key); var v = encodeURIComponent(obj[key]); list[list.length] = k+'='+v; } var query = list.join( '&' ); return query; } window.onload =start;

  • 二次元配列に値をセットしたいんですが

    ASP(html)での変数をJavaScriptに渡して 二次元配列を作成したいのですが、どうもうまくいきません。 どなたか、ご教授願います。 サンプル 変数:strFact = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" -------------------JavaScript strFact_WK = <%=strFact %>  ※1 var test = new Array(); var rows = strFact_WK.split("/"); for( var i in rows) { test.push(new Array()); var cols = rows[i].split(","); for( var j in cols) { test[i].push(cols[j]); } } ---------------------- 当然ですが、 ※1の所で strFact_wk = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" とすると作成されます。

  • for in文のkey取得できない

    for (var key in hogeobject) { if(key <= 10) {        alert("1" + key); switch (key){       alert("2" + key); このようなソースを書きました。 alert("1" + key); は表示されますが alert("2" + key); は表示されません。 どのようにkeyの値を渡せばよいのでしょうか。 スコープの概念がわかっていないと思います。 宜しくお願いいたします。

専門家に質問してみよう