【发布时间】:2013-03-06 22:00:09
【问题描述】:
我是一名尝试学习 Ruby 的 Perl 开发人员... 所以,我将在 Perl 中演示我在 Ruby 中尝试完成的工作,然后在最后总结...
#!/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 均无济于事。
也就是说,我确实找到了以下 sn-p,刚才,它几乎可以工作,但我确定我做错了什么......
h = Hash[j.collect {|array| [array.key1,array.key4] }]
这为我提供了正确的哈希键,但它不会将 key4 值推送到哈希数组中。仍在寻找,但在正确的方向上轻推一些将不胜感激。如果我在这里得到答案之前找到答案,我会回答这个问题,以启发未来的读者。
编辑! 我需要澄清一些我刚刚发现的东西,可能是我时钟上的扳手。我得到的数据不是纯数组。它实际上是来自 DataMapper 的一个对象。
【问题讨论】:
-
它可能与 Perl 风格的传统背道而驰,但您可能更喜欢清晰而不是简洁 - 仅仅因为您 可以 使其成为单行,并不意味着您应该。您确实想要的是能够在 6 个月内回到它,而不是想“到底是谁写了这个想法?”
-
在 Ruby 中,您可以通过正确分解的代码获得清晰的和简洁性。
标签: ruby multidimensional-array hashmap ruby-datamapper