- ベストアンサー
【javascript】ハッシュのキーをソートして取り出したい
ハッシュのキーをソートして取り出したいです。 perlで表現すると、以下の様なかんじです。 foreach $key (sort keys %hash) { ... } そこで、prototype.jsを使って以下の様に書いてみました。 <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body > <script > var table = {c:'C', b:'B', a:'A'}; $H(table).keys().sort().each(function(key){ alert(key + ' ' + table[key]); }); </script> </body> </html> 他に良い方法ありましたら、教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
配列のsortをつかってみては? <script > var table = {c:'C', b:'B', a:'A'}; var newtable =new Object; var keylist=new Array; for(var i in table) keylist.push(i); keylist.sort(); for(var i in keylist) newtable[keylist[i]]=table[keylist[i]]; for(var i in newtable) document.write(i+":"+newtable[i]); </script>
その他の回答 (2)
- Gotthold
- ベストアンサー率47% (396/832)
最近のPrototype.jsはObject.prototypeにプロパティを追加しないと思います。 for(var i in keylist)がうまく動かなかったのは Prototype.jsがArray.prototypeを拡張しているからでは無いですか? keylistは配列なのですから、無難に for(var i=0; i<keylist.length; i++) の方が良い気がします。
お礼
Gottholdさん、ご回答ありがとうございます。 >keylistは配列なのですから、無難に >for(var i=0; i<keylist.length; i++) >の方が良い気がします。 たしかにそうですね。なっとくです。
for(var i in keylist) がうまくいかないというのはこういうことでしょうか。 Prototype.js は Object.prototype に独自のプロパティを設置するタイプのライブラリだったと思います。 例えば、 javascript: Object.prototype.hoge='foo'; var obj={'a':1}; for(var x in obj)alert(x+' : '+obj[x]); というブックマークレットを実行すると、アラートは2回起こります。(a : 1 と hoge : foo です) こっちだったら javascript: Object.prototype.hoge='foo'; var obj={'a':1}; for(var x in obj)if(obj.hasOwnProperty(x))alert(x+' : '+obj[x]); アラートは1回だけです。(a : 1 だけ) 余談ですが、こういう意図しない弊害が出たりすることがあるので、Object.prototype を無闇に弄るのはやめましょう。
お礼
edvakfさん ご回答ありがとうございます。 とても良いアドバイスで大変参考になりました。
お礼
yambejpさん ご回答ありがとうございます。 提示して頂いた方法で簡素にできますね。 しかし、prototype.jsとの併用は出来ないみたいです。。 for(var i in keylist) がうまくいかないのかなぁ。