配列と連想配列と再帰関数のこと
hoge=function(arglst){ if(isArray(arglst)){ for(arg in arglst) hoge(arg); }else{ hoge(arglst); } } hoge([...]); #=> 配列の各要素に対してhoge()を実行 hoge({...}); #=> 連想配列そのものに対してhoge()を実行
みたいな、ちょこっとだけ再帰する関数を書きたいなと思ってFirebugのコンソールで遊んでいたら、何だかうまくいかない。typeof使って調べてみたら配列も連想配列も同じobjectとして判定されていた。いやまあ、単純に仕様をいまひとつ理解していなかっただけなのだけれど。
下記のコードを実行したら何とも愉快な結果に。配列からは大量の関数の情報が見える。一方連想配列からはa,b,cの情報しか見えない。
prt=console.log var keys= {a:10,b:20,c:30}; var lst = [1,2,3]; for(name in keys) prt(name,":",keys[name]); for(name in lst) prt(name,":",lst[name]);
isArrayに相当する関数を自分でうまく作るには、とググっていたらjQueryでの判定の話がちょくちょく出てきたけれど、個人的に参考になるなと思ったのは id:fbis:20091112:1258002754 の記述。PHPのことだけれど基本的には同じことをやってやればいいはず。
そんで再帰云々に関しては、array.forEach使ってやれば丸投げ出来るので別に再帰にしなくてもいいかなー、とか。いやまあ、minibufferのaddCommandにいくつかのコマンドをまとめて登録するにはどうしたら楽かなーというのが今回の出発点なのでした。
追記
ちゃんと調べたらinstanceofもあるし、関数内ならargumentsも使えるしで、何も悩む必要がなかった。コードの道は深い。