2016-07-10 24 views
-1

说我有这样的数据的哈希:有没有一种内置的方式来获得新的哈希组成的Ruby只有一定的密钥?

data = [{..}, {..}, {..}] 

每个散列是这样

{ :ctiy => 'sdfd', :pop => 33, :best_food=> 'sdfa'....} 

现在怎样可以得到只包含某些键/值或多个密钥散列数组。所以拿城市来说,如果我想要新的只包含城市的哈希数组。

我知道,我可以循环和手动过滤,但有一种内置的方法,我失踪了。

+1

您可能正在寻找Array的地图方法。类似于data.map {| i |我[:city]}或data.map {| i | {city:i [:city]}} –

+0

我们希望看到您为解决这个问题付出了多少努力,无论是使用最小代码展示您尝试的内容,还是您在何处搜索了解为什么这些网页没有帮帮我。因为它看起来像你希望我们为你写代码,这不是它的目的。请阅读“[问]”,包括链接的页面,以及http://meta.stackoverflow.com/q/261592/128421。 –

+0

您的标题和散列后面的文字很混乱。一方面你指的是“某个键”,另一方面是“多个键”。你想要哪一个答案? –

回答

1

map将帮助:

original_array_of_hashes.map do |hash| 
    { city: hash[:city] } 
end 

如果你使用Rails,该slice方法可用:

original_array_of_hashes.map do |hash| 
    hash.slice(:city) 
end 

对于多键:

# without 'slice' 
original_array_of_hashes.map do |hash| 
    { key_one: hash[:key_one], key_two: hash[:key_two] } 
end 

# with 'slice'  
original_array_of_hashes.map do |hash| 
    hash.slice(:key_one, :key_two) 
end 
+0

我想这是最简单的方法,并没有本地的方式来做到这一点 –

1
arr = [{ :city => 'Paris',  :country => 'France', :pop => 2240001 }, 
     { :city => 'Bardelona', :country => 'Spain', :pop => 1600002}, 
     { :city => 'Vancouver', :country => 'Canada', :pop => 603503 }] 

def some_keys(arr, *keys_to_keep) 
    arr.map { |h| h.select { |k,_| keys_to_keep.include? k } } 
end 

some_keys (arr) 
    #=> [{}, {}, {}] 
some_keys(arr, :city) 
    #=> [{:city=>"Paris"}, {:city=>"Bardelona"}, {:city=>"Vancouver"}] 
some_keys(arr, :city, :pop) 
    #=> [{:city=>"Paris", :pop=>2240001}, 
    # {:city=>"Bardelona", :pop=>1600002}, 
    # {:city=>"Vancouver", :pop=>603503}] 
some_keys(arr, :city, :country, :pop) 
    #=> [{:city=>"Paris", :country=>"France", :pop=>2240001}, 
    # {:city=>"Bardelona", :country=>"Spain", :pop=>1600002}, 
    # {:city=>"Vancouver", :country=>"Canada", :pop=>603503}] 

这使用(不是Enumerable#select)。

+0

我不明白。如果'keys_to_keep = []'你想返回'arr'? –

相关问题