如何在不指定Ruby中的单个值的情况下获取哈希中的所有值?

时间:2015-04-17 11:13:48

标签: ruby arrays hash hashmap

这是我昨天提出的问题的补充,但认为这是一个新问题。

我正在接受JSON响应并希望每次迭代提取所有值并将它们放入数组中

@response =  { "0"=>{"forename_1"=>"John", "surname_1"=>"Smith", forename_2"=>"Josephine", "surname_2"=>"Bradley", "middle_1"=>""}, 
               "1"=>{"forename_1"=>"Chris", "surname_1"=>"Jenkins", forename_2"=>"Christine", "surname_2"=>"Sugar", "middle_1"=>""}, 
               "2"=>{"forename_1"=>"Billy", "surname_1"=>"Bob", forename_2"=>"Brenda", "surname_2"=>"Goodyear", "middle_1"=>""},
               "Status" => 100
             }

目前,此方法采用我想要的特定值并将它们放入我想要的数组中。

col = @response.values.grep(Hash).map { |h| "#{h['forename_1']} #{h['surname_1']} #{h['forename_2']} #{h['surname_2']} #{h['middle_1']}" }

有没有办法说抓住所有值并将它们放入一个数组(我有一个响应,其中返回超过25个键/值对)。

如果middle_1没有值,那么" "会被放入数组中,理想情况下我想删除它们。

理想情况下,我希望我新组建的数组看起来像

["John Smith Josephine Bradley", "Chris Jenkins Christine Sugar", "Billy Bob Brenda Goodyear"]

即使没有提供middle_1,数组中也没有双重空格。我想学习如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

也许会提供"破解" hash并提取您需要的内容:

h = {a1: "a", b2: "b", c3: "", d4: nil, e5: "e"}

values = h.values.map(&:to_s).reject(&:empty?)
# => ["a", "b", "e"]

values.join(" ")
# => "a b e"

让我们考虑h.values.map(&:to_s).reject(&:empty?)

values = h.values
# => ["a", "b", "", nil, "e"]

values = values.map(&:to_s)
# => ["a", "b", "", "" "e"]

values = values.reject(&:empty?)
# => ["a", "b", "e"]

希望能让您知道如何继续。

祝你好运!

<强>更新

对于提供的hash,您可以很容易地重复我上面描述的内容,如:

col = @response.values
               .grep(Hash)
               .map { |h| h.values.map(&:to_s).reject(&:empty?).join(" ") }

p col
# => ["John Smith Josephine Bradley", "Chris Jenkins Christine Sugar", "Billy Bob Brenda Goodyear"]