私は Ruby を学ぼうとしている Perl 開発者です... そこで、私が Ruby で達成しようとしていることを Perl でデモンストレーションし、最後に要約します...
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
# Given the following data structure (an array of hashes)
my $j = [
{
id => 1,
key1 => 'name1',
key2 => 'data',
key3 => 'data',
key4 => 'foo',
},
{
id => 2,
key1 => 'name1',
key2 => 'data',
key3 => 'data',
key4 => 'bar',
},
{
id => 3,
key1 => 'name2',
key2 => 'data',
key3 => 'data',
key4 => 'baz',
},
];
print ~~@$j,"\n";
print Dumper($j)."\n";
my $myHash; # make it a reference to a hoa.
for my $array ( @{$j} )
{
# the key to my new key-name is always known
push(@{$myHash->{$array->{key1}}},$array->{key4});
}
print Dumper($myHash)."\n";
そして出力:
初期配列:
$VAR1 = [
{
'key2' => 'data',
'key4' => 'foo',
'key1' => 'name1',
'id' => 1,
'key3' => 'data'
},
{
'key2' => 'data',
'key4' => 'bar',
'key1' => 'name1',
'id' => 2,
'key3' => 'data'
},
{
'key2' => 'data',
'key4' => 'baz',
'key1' => 'name2',
'id' => 3,
'key3' => 'data'
}
];
私が取得しようとしているもの:
$VAR1 = {
'name2' => [
'baz'
],
'name1' => [
'foo',
'bar'
]
};
...そして、できるだけ簡潔なコードでそれを実行しようとしていますが、Ruby の良さが欠けていることを考えると、これは苦痛であることが証明されています。Perl で使用したのと同じコード構造に似た map でのいくつかの試行を含め、これを複数回試みましたが、役に立ちませんでした。
そうは言っても、今、次のスニペットを見つけましたが、これはほとんど機能しますが、何か間違っていると確信しています...
h = Hash[j.collect {|array| [array.key1,array.key4] }]
これで正しいハッシュ キーが得られますが、key4 の値がハッシュの配列にプッシュされません。まだ探していますが、正しい方向への微調整をいただければ幸いです。ここで答えを得る前に答えを見つけた場合は、将来の読者の教育のために質問に答えます.
編集!私はちょうど私が理解した何かを明確にする必要があり、おそらく私の時計のレンチです. 取得しているデータは純粋な配列ではありません。実際には DataMapper のオブジェクトです。