从数组哈希中拉出键和值

时间:2014-06-03 19:45:20

标签: ruby

我有这样的哈希 -

    {"examples"=>
      [{"year"=>1999,
            "provider"=>{"name"=>"abc", "id"=>711},
            "url"=> "http://example.com/1",
            "reference"=>"abc",
            "text"=> "Sample text 1",
            "title"=> "Sample Title 1",
            "documentId"=>30091286,
            "exampleId"=>786652043,
            "rating"=>357.08115},
        {"year"=>1999,
            "provider"=>{"name"=>"abc", "id"=>3243},
            "url"=> "http://example.com/2",
            "reference"=>"dec",
            "text"=> "Sample text 2",
            "title"=> "Sample Title 2",
            "documentId"=>30091286,
            "exampleId"=>786652043,
        "rating"=>357.08115},
        {"year"=>1999,
            "provider"=>{"name"=>"abc", "id"=>191920},
            "url"=> "http://example.com/3",
            "reference"=>"wer",
            "text"=> "Sample text 3",
            "title"=> "Sample Title 3",
            "documentId"=>30091286,
            "exampleId"=>786652043,
        "rating"=>357.08115}]
}

我想通过拉出键来创建一个新数组,并且仅为“text”,“url”和“title”键创建一个值,如下所示。

   [
     {"text"=> "Sample text 1", "title"=> "Sample Title 1", "url"=> "http://example.com/1"},
     {"text"=> "Sample text 2", "title"=> "Sample Title 2", "url"=> "http://example.com/2"},
     {"text"=> "Sample text 3", "title"=> "Sample Title 3", "url"=> "http://example.com/3"}
   ]

真心感谢任何帮助。

2 个答案:

答案 0 :(得分:7)

你应该这样做

hash['examples'].map do |hash|
    keys = ["text", "title", "url"]
    keys.zip(hash.values_at(*keys)).to_h
end

如果你低于< 2.1使用,

 Hash[keys.zip(hash.values_at(*keys))]

答案 1 :(得分:1)

这是另一种可以做到的方式(其中h是问题中给出的哈希)。

KEEPERS = ['text','url','title']

h.each_key.with_object({}) { |k,g|
  g[k] = h[k].map { |h| h.select { |sk,_| KEEPERS.include? sk } } }
    #=> {"examples"=>[
    #     [{"url"=>"http://example.com/1", "text"=>"Sample text 1",
    #       "title"=>"Sample Title 1"},
    #      {"url"=>"http://example.com/2", "text"=>"Sample text 2",
    #       "title"=>"Sample Title 2"},
    #      {"url"=>"http://example.com/3", "text"=>"Sample text 3",
    #       "title"=>"Sample Title 3"}]}

这里我们简单地创建一个新的哈希(由外部块变量g表示),其中包含原始哈希h的所有键(只有一个,"examples",但是可以更多),并且对于每个关联值,这是一个哈希数组,我们使用Enumerable#mapHash#select来保留每个哈希值中所需的键/值对。