Ruby:如何从给定数据形成struct数组

时间:2013-10-17 06:15:15

标签: ruby arrays

我是Ruby的新手。我在变量'@member'

中有这些数据
 [{"clicks"=>"1", "member"=>{"email"=>"abc@gmail.com", "id"=>"f6d02be6", "euid"=>"f02be6", "email_type"=>"html", "ip_signup"=>nil, "leid"=>"3223865", "clients"=>[], "static_segments"=>[], "notes"=>[]}}, {"clicks"=>"1", "member"=>{"email"=>"dft@gmail.com", "id"=>"336ed115c4", "euid"=>"3365c4", "email_type"=>"html", "ip_signup"=>nil, "timestamp_signup"=>nil, "ip_opt"=>nil, "leid"=>"14877", "clients"=>[], "static_segments"=>[], "notes"=>[]}}, {"clicks"=>"2", "member"=>{"email"=>"man8@gmail.com", "id"=>"334a7f", "euid"=>"334617", "email_type"=>"html", "ip_signup"=>nil, "leid"=>"377", "clients"=>[], "static_segments"=>[], "notes"=>[]}}, {"clicks"=>"1", "member"=>{"email"=>"sub60@gmail.com", "id"=>"4e9b7", "euid"=>"4e9b7", "email_type"=>"html", "ip_signup"=>nil, "timestamp_signup"=>nil, "ip_opt"=>nil, "leid"=>"4605", "clients"=>[], "static_segments"=>[], "notes"=>[]}}, {"clicks"=>"1", "member"=>{"email"=>"mail@moll.com", "id"=>"083fd3", "euid"=>"083fd3", "email_type"=>"html", "ip_signup"=>nil, "timestamp_signup"=>nil, "ip_opt"=>nil, "leid"=>"314649", "clients"=>[], "static_segments"=>[], "notes"=>[] }}] 

我需要从上面的数据中获取成员电子邮件,euid和leid到struct / hashes数组中。

我试过

@emails = @member.map { |x| x['member']['email']['euid']['leid'] }

但它返回零。

有人可以帮忙怎么做吗?

请原谅,如果它太基本,但无法解决。

4 个答案:

答案 0 :(得分:4)

将字段作为数组:

@member.map { |m| m["member"].values_at('email','euid','leid') }
#=> [["abc@gmail.com", "f02be6", "3223865"], ["dft@gmail.com", "3365c4", "14877"], ["man8@gmail.com", "334617", "377"], ["sub60@gmail.com", "4e9b7", "4605"], ["mail@moll.com", "083fd3", "314649"]]

或者作为哈希:

@member.map { |m| m["member"].select { |k, v| ['email','euid','leid'].include? k } }
#=> [{"email"=>"abc@gmail.com", "euid"=>"f02be6", "leid"=>"3223865"}, {"email"=>"dft@gmail.com", "euid"=>"3365c4", "leid"=>"14877"}, {"email"=>"man8@gmail.com", "euid"=>"334617", "leid"=>"377"}, {"email"=>"sub60@gmail.com", "euid"=>"4e9b7", "leid"=>"4605"}, {"email"=>"mail@moll.com", "euid"=>"083fd3", "leid"=>"314649"}]

顺便说一下,你应该将变量命名为@members(复数)。

答案 1 :(得分:0)

你应该像这样使用并将它带到你的数组

@emails = @member.map { |x| x['member']['email'], x['member']['euid'], x['member']['leid'] }

因为x['member']['email']['euid']x['member']['euid']

不同

答案 2 :(得分:0)

@data = @member.map{|x| {'email' => x['member']['email'], 'euid' => x['member']['euid'], 'leid' => x['member']['leid']} }

答案 3 :(得分:0)

既然您的问题已得到解答,我想就向SO发布问题提供一些建议。通常,注释用于建议,但由于格式限制,这在这种情况下不起作用。这是你可能提出问题的一种方式:


我有以下数组:

@members = [ \
  {"clicks"=>"1", \
    "member"=>{"email"=>"abc@gmail.com", "euid"=>"f02be6", "leid"=>"3"}}, \
  {"clicks"=>"1", \
    "member"=>{"email"=>"dft@gmail.com", "ip_signup"=>nil, "leid"=>"14877"}}, \
  {"clicks"=>"2", \
    "member"=>{"email"=>"man8@gmail.com", "euid"=>"334617", "leid"=>"377"}}]

我想只提取键emailleid的哈希值,并将它们放入一个数组中,如下所示:

member_arr = [["abc@gmail.com", "3"], ["dft@gmail.com", "14877"], \
    ["man8@gmail.com", "leid"=>"377"]]

我是Ruby新手。我怎么能这样做?


在重述问题时,我做了以下

  • 将感兴趣的键数从3减少到2,并消除了大部分哈希元素,以简化示例而不会简化问题。
  • 使用了行继续符(\),这样可以看到没有水平滚动的@members,也可以澄清@members的结构。
  • 精确地解释了我想要实现的目标,并为示例输入显示了所需的输出。

另一件事。您在发布问题后约一小时选择了您的首选答案,可能只要阅读了适合您的答案即可。通过等待更长时间 - 至少几个小时 - 人们往往会得到更好和/或更多样化的答案。通过将鼠标光标放在复选标记上,可以看到选择答案的时间。看看其他SO问题。