• ベストアンサー

【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> 他に良い方法ありましたら、教えてください。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

配列の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>

kingfruits
質問者

お礼

yambejpさん ご回答ありがとうございます。 提示して頂いた方法で簡素にできますね。 しかし、prototype.jsとの併用は出来ないみたいです。。 for(var i in keylist) がうまくいかないのかなぁ。

その他の回答 (2)

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

最近のPrototype.jsはObject.prototypeにプロパティを追加しないと思います。 for(var i in keylist)がうまく動かなかったのは Prototype.jsがArray.prototypeを拡張しているからでは無いですか? keylistは配列なのですから、無難に for(var i=0; i<keylist.length; i++) の方が良い気がします。

kingfruits
質問者

お礼

Gottholdさん、ご回答ありがとうございます。 >keylistは配列なのですから、無難に >for(var i=0; i<keylist.length; i++) >の方が良い気がします。 たしかにそうですね。なっとくです。

noname#87714
noname#87714
回答No.2

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 を無闇に弄るのはやめましょう。

kingfruits
質問者

お礼

edvakfさん ご回答ありがとうございます。 とても良いアドバイスで大変参考になりました。

関連するQ&A

  • 2次元ハッシュ または 2次元配列をソートしたい

    2次元ハッシュのソートをしたいです。 ハッシュは2つのキーを使用していて、 1つ目のキーは文字列、2つ目のキーは数字(0からの連番)です。 ハッシュの中身は文字列が入っています。 これを次のような表に見立てて、特定の列でソートしたいのです。 hash['a']['0'], hash['a']['1'], ..., hash['a']['50'], hash['q']['0'], hash['q']['1'], ..., hash['q']['50'], hash['c']['0'], hash['c']['1'], ..., hash['c']['50'], ... hash['d']['0'], hash['d']['1'], ..., hash['d']['50'], 例えば 6列目の値によってソートするということです。 以下のようにソートしようとしましたが、うまくいきません。 my @sorthash = sort { $a->[6] <=> $b->[6] } @hash; 何かヒントがあれば教えてください。

    • ベストアンサー
    • Perl
  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • ハッシュのハッシュを値とキーでソートする方法

    %array = ( 'A' => {   'a' => 7,   'b' => 3,   'c' => 9,   'd' => 1, }, 'B' => {   'a' => 3,   'b' => 8,   'c' => 3, },); のようなハッシュがあったとして、値の降順、1つ目のキー昇順、2つ目のキー昇順でソートし、下のような形で出力したいのですが、どのようにすればよいのでしょうか。 A  c  9 B  b  8 A  a  7 A  b  3 B  a  3 B  c  3 A  d  1

    • ベストアンサー
    • Perl
  • ハッシュのソート

    ハッシュに以下のようなデータが格納されている場合 valueでソートして表示するにはどうしたらよいでしょうか? 教えてください。 %hoge = (a => 10, b => 3, c => 7); 表示 a => 10 c => 7 b => 3

    • ベストアンサー
    • Perl
  • ハッシュのハッシュのソート

    rubyでハッシュのソート方法についてはいくつか情報のサイトを見つけられました。 ですが今やりたいのは、ハッシュのハッシュのソートなのですが、うまいやり方がわかりませんでした。 具体的には、 h1 = {"user1"=>{"a"=>10, "b"=>20, "c"=>30"}, "user2"=>{"d"=>5, "e"=>8}, "user3"=>{"f"=>10, "g"=>5, "h"=>10} } というようなハッシュのハッシュを想定しています。ユーザごとに案件ごとの必要工数(時間)をハッシュとして持たせ、全工数が多いユーザ順にソートしたいのです。 上記の場合だと、 {"user1"=>{"a"=>10, "b"=>20, "c"=>30"}, "user3"=>{"f"=>10, "g"=>5, "h"=>10}, "user2"=>{"d"=>5, "e"=>8} } というようにソートしたいのですが、何かやり方がありましたらご教授いただけますでしょうか。

    • ベストアンサー
    • Ruby
  • Ruby 2次元のハッシュ

    Rubyで2次元のハッシュを扱いたいです。 perlで書くと以下のような感じです。(最近perlに疎遠なので自信無いですが^^;) hash{$key1}{$key2}=$value; foreach $key1 (keys %hash){ foreach $key2 (keys %{$hash{$key1}}){ print "$hash{$key1}{$key2}\n"; } } Rubyだとどんな感じになりますか?

  • 動的ハッシュを作って取り出したいのですが・・・

    お世話になります。 フォームから送られてくるデータを動的に作ったハッシュで参照出来るように取り組んでるんですが、思ったように出来ず思い悩んでおります。 どうすれば、意図した形でデータを取り出すことが出来ますでしょうか my %FORM = ( 'd01' => 'あ', 'd02' => 'い', 'd03' => 'う', 'd04' => 'え', 'd05' => 'お', 'd06' => 'か', 'd07' => 'き', 'd08' => 'く', 'd09' => 'け', 'd10' => 'こ', ); for(sort { $FORM{$a} cmp $FORM{$b} } keys %FORM){ print "$_ = $FORM{$_} \n"; } $list="d01,d02,d03,d04,d05,d06,d07,d08,d09,d10,"; $i=-1; foreach (split/,/,$list){ $i++; $hash{$_}=$i; } for(sort { $hash{$a} <=> $hash{$b} } keys %hash){ print "$_ = $hash{$_} \n"; $view = ${"FORM$_"}; print "$view\n"; }; 最後のprint "$view\n";箇所で、 $list="d01,d02..." を split/,/,$list したので、 $FORM{d01} $FORM{d02} となるようにして、 「あ い う え お」と取り出したいのです。 ご教授のほど、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • ハッシュの中身の表示

    ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 二次元ハッシュの引き出し方について

    2次元のハッシュをObjectを用いて作り、以下の様に第一キー固定で第二キーを取り出したいです。 ----------------------------------------------------------- hash = new Object; hash[3] = new Object; hash[3][1] = 3; hash[3][2] = 6; hash[3][3] = 9; for (key in hash[3]){  _root.debug+=key; } ----------------------------------------------------------- 上記は上手く動かないので、以下の様に修正しました。 ----------------------------------------------------------- hash = new Object; hash[3] = new Object; hash[3][1] = 3; hash[3][2] = 6; hash[3][3] = 9; tmp=hash[3]; for (key in tmp){  _root.debug+=key; } ----------------------------------------------------------- いったんtmpに代入する事で期待通りの結果が得られましたが、スッキリしません。 Perl等の他言語では、「無名ハッシュ」という概念を表記化することができるので、Actionscriptでも良い表記方法がありましたら教えてください。 ※オーサリングルールはParaFla! ActionSctiptは1.0相応です。

  • 二次元配列のハッシュ版の記述方法?

    二次元配列のハッシュ版を実現させたいのですが、 以下の記述で正しいでしょうか? 構文に疎いので教えてください。 #!/usr/bin/perl %HASH_TEST = ( 'あ'=>{'A'=>'1', 'B'=>'2', 'C'=>'3'}, 'い'=>{'A'=>'4', 'B'=>'5', 'C'=>'6'}, ); print $HASH_TEST{'い'}{'B'}; #=> 5が表示されます。 exit; __END__

    • ベストアンサー
    • Perl

専門家に質問してみよう