2016-01-06 37 views
0

我有以下散列:搜索哈希散列內,並返回鍵

{1=>{"label"=>"New", "color"=>"#whatver"}, 2=>{"label"=>"In-progress", "color"=>"#whatever"}, 3=>{"label"=>"Closed", "color"=>"#whatever"}} 

而且我有一個數組,如:['New', 'In-progress']

我需要從一個數組返回鍵[1, 2]那個散列。

我所做的嘗試:

labels = ['New', 'In-progress'] 
labels.map { |label| statuses.detect { |hash| hash.second[:label] == label }.first } 
# => [1, 2] 

哪個是正確的,我想確切的事情,但是否有這樣做的更直接的方式?

+0

當你舉一個例子,請分配給每個輸入值的變量(例如,'H = {1 => ... }'和'arr = ['New'...]'),這樣讀者就可以在註釋和回答中引用這些變量而無需定義它們。 –

+0

我不是那麼做嗎? –

+0

我不知何故弄錯了。我很抱歉。但是,你不認爲當你第一次提到這兩個對象時,分配這些變量會更好嗎?如果你這樣做了,你就不必重複這個數組,並且'statuses'的含義是明確的。 –

回答

2
在你想達到什麼樣的條件

也許沒有那麼多短,但清晰的:

h.select { |_, value| ['New', 'In-progress'].include?(value['label']) }.keys 
0

除了@ NDN的答案,這裏有兩個方法來提取所需的密鑰。

data = {1=>{"label"=>"New", "color"=>"#whatver"}, 2=>{"label"=>"In-progress", "color"=>"#whatever"}, 3=>{"label"=>"Closed", "color"=>"#whatever"}} 

labels = ['New', 'In-progress'] 

data.map{|k, h| k if labels.include?(h["label"])}.compact 
# => [1, 2] 

data.dup.delete_if{|_, h| !labels.include?(h["label"])}.keys 
# => [1, 2] 
0

你可以這樣做如下:

h = {1=>{"label"=>"New", "color"=>"#whatver"}, 
    2=>{"label"=>"In-progress", "color"=>"#whatever"}, 
    3=>{"label"=>"Closed", "color"=>"#whatever"}} 

labels = ['New', 'In-progress'] 

result = h.select do |k, hash| 
    # Check if any label is part of values array 
    labels.any? {|label| hash.values.include?(label)} 
end 

p result.keys 
#=> [1,2] 
2
h = {1=>{"label"=>"New", "color"=>"#whatver"}, 
    2=>{"label"=>"In-progress", "color"=>"#whatever"}, 
    3=>{"label"=>"Closed", "color"=>"#whatever"}} 
labels = ['New', 'In-progress'] 

h.select { |_,v| (v.values & labels).any? }.keys 
    #=> [1, 2]