• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:引数の数によって取得する配列の深さを変更するには?)

引数の数によって配列の深さを変更する方法とは?

このQ&Aのポイント
  • 引数の数によって取得する配列の深さを変更する方法について教えてください。
  • 現状、switch文を使用して配列の深さを変更していますが、他に良い方法はありますか?
  • 回答いただけると嬉しいです。引数の数に応じて適切な配列の深さを取得する方法をご教授ください。

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

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

#2です。 NodeListの場合はそのままでは無理みたいですが、一度、通常の配列に置換えておけば ary.map(function(e){ e.firstChild.innerHTML = "1列目"; }); ary.map(function(e){ e.childNodes[1].style.backgroundColor = "blue"; }); みたいにして、作成した関数を介さない方が、私には直感的に理解しやすいですね。 (いずれにしろ、個々の処理は個別に指定しているのですから)

localhosts
質問者

お礼

ありがとうございます。.map()かー NodeListはArrayじゃなくてNodeListだったんですね。 ではこんな感じかな? function(x){x. と }を書くのが面倒(そんなこと言う奴はプログラミングやめてしまえ なかなかいい感じかも。 <body> <table> <tbody> <tr><td>01</td><td>02</td><td>03</td></tr> <tr><td>11</td><td>12</td><td>13</td></tr> <tr><td>21</td><td>22</td><td>23</td></tr> </tbody> </table> <script> NodeList.prototype.access=function(Func){ var Ary=[]; for(var i=0;i<this.length;i++){Ary[i]=this[i]} Ary.map(Func); } xNodeList=document.getElementsByTagName('tr'); xValue='1列目'; xNodeList.access(function(x){x.firstChild.innerHTML=xValue}); xValue='background:blue;'; xNodeList.access(function(x){x.childNodes[1].style.cssText=xValue}); </script> </body> 動くけど.prototypeの定義方法ってこれであってるのかな・・・自信ないです

localhosts
質問者

補足

お礼書いた後検索してみたらMDNに似たようなのありました。 https://developer.mozilla.org/En/DOM/NodeList#Workarounds 同じような疑問を持った人の参考になれば。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

ご質問の意味をよく理解できていませんけれど… 配列から値を一つ取り出せればよいだけと、勝手に解釈して、 こんなことをやりたいのでしょうか? function hoge(){  var i, ary = arguments[0];  for(i=1; i<arguments.length; i++)   ary = ary[arguments[i]];   ・・・・・・ 配列の次元と引数の数があっているかとか、いろいろなチェックが必要そうな気がしますが、本質的ではないので全部省略しています。 しかし、もしも(↑)このような意味だとするなら、関数側で面倒な解析をするよりも呼び出し側で  hoge( Ary[p1][p2] ); などとするほうが、遥かに簡単でわかりやすいかと思いますが… (どうせ引数でダイレクトに指定しているだけみたいだし)

localhosts
質問者

お礼

回答ありがとうございます。 >for(var i=0;i<arguments.length;i++)var ary=arguments[i]; なるほどー。その発想ができなかった・・・ DOMいじってる時にinnerHTMLやstyle.cssTextとかを一括削除/設定したりする時に毎回for文書いてまわすのが面倒だなぁと思ったしだいです。 function concaino(cNodeList,cPropaty,cValue){ for(var i=0;i<cNodeList.length;i++){ var targetPropaty=cNodeList[i]; for(var p=0;p<cPropaty.length;p++){ targetPropaty=targetPropaty[cPropaty[p]] } targetPropaty=(cValue!=undefined)?cValue:null; } } こんな感じかなぁ、もうちょっとスマートにならないかな~。 一度[i][固定][固定]を定義してそれをforで回せる方がイケメン。 構造上やっぱり無理か・・・

localhosts
質問者

補足

お礼の関数間違ってた。 正しくは function concaino(cNodeList,cPropaty,cValue){ for(var i=0;i<cNodeList.length;i++){ var targetPropaty=cNodeList[i]; for(var p=0;p<cPropaty.length-1;p++){ targetPropaty=targetPropaty[cPropaty[p]] } targetPropaty[cPropaty[p]]=(cValue!=undefined)?cValue:null; } } 使い方例: <table> <tbody> <tr><td>01</td><td>02</td><td>03</td></tr> <tr><td>11</td><td>12</td><td>13</td></tr> <tr><td>21</td><td>22</td><td>23</td></tr> </tbody> </table> <script> cNodeList=document.getElementsByTagName('tr'); cPropaty=['firstChild','innerHTML']; cValue="1列目"; concaino(cNodeList,cPropaty,cValue); cPropaty=['childNodes',1,'style','cssText']; cValue='background:blue;'//二行目背景青に concaino(cNodeList,cPropaty,cValue); </script> みたいに。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

正直なにをしたいのかよくわかりませんが 再帰的な処理をするならこんな風にすればよいかもしれません (depthはあえて指定する必要ないと思いますがデバッグ用につけてあります) <script> var x={a:{b:{c:"d",e:"f"},g:{h:"i"},j:"k"},l:"m"}; check(x,"",0); function check(obj,arg,depth) { depth++; for(var i in obj){ document.write("depth:"+depth+","); document.write(i+":"); if((typeof obj[i]).toUpperCase()=="OBJECT"){ document.write("object"); document.write("<br>"); check(obj[i],i,depth); }else{ document.write(obj[i]); document.write("<br>"); } } } </script>

すると、全ての回答が全文表示されます。

関連するQ&A