2016-07-10 22 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'? –

相關問題