2012-08-22 12 views
7

मैं हैश के इस सरणी है:को खोजने के लिए कैसे और हैश की एक सरणी के भीतर एक हैश मान लौटने के लिए, हैश में कई अन्य मूल्यों दिया

results = [ 
    {"day"=>"2012-08-15", "name"=>"John", "calls"=>"5"}, 
    {"day"=>"2012-08-15", "name"=>"Bill", "calls"=>"8"}, 
    {"day"=>"2012-08-16", "name"=>"Bill", "calls"=>"11"}, 
] 

मैं खोज परिणामों कितने कॉल विधेयक को खोजने के लिए कर सकते हैं कैसे 15 वीं को बनाया गया?

के बाद "Ruby easy search for key-value pair in an array of hashes" के जवाब को पढ़ने, मुझे लगता है कि निम्नलिखित खोजने के बयान पर विस्तार हो रहा शामिल हो सकता है:

results.find { |h| h['day'] == '2012-08-15' }['calls'] 

उत्तर

15

आप पर हैं दायीं पटरी!

results.find {|i| i["day"] == "2012-08-15" and i["name"] == "Bill"}["calls"] 
# => "8" 
+0

मैंने पहले वहां एक कॉमा की कोशिश की थी, लेकिन आपका _and_ पूरी तरह से काम करता है! बहुत बहुत धन्यवाद। – s2t2

+4

@ s2t2 यदि आप 'और' 'instad का उपयोग भी कर सकते हैं – PriteshJ

0

एक सच में अनाड़ी कार्यान्वयन;)

def get_calls(hash,name,date) 
hash.map{|result| result['calls'].to_i if result['day'] == date && result["name"] == name}.compact.reduce(:+) 
end 

date = "2012-08-15" 
name = "Bill" 

puts get_calls(results, name, date) 
=> 8 
+1

आप @ ARun32 संस्करण का उपयोग कर सकते हैं अगर आप वाकई केवल एक रिकॉर्ड है कर रहे हैं प्रति संयोजन – PriteshJ

+0

मेरे पास प्रति कॉम्बो केवल एक रिकॉर्ड है। धन्यवाद। – s2t2

1
results.select { |h| h['day'] == '2012-08-15' && h['name'] == 'Bill' } 
    .reduce(0) { |res,h| res += h['calls'].to_i } #=> 8 
0

वास्तव में, "को कम" या "इंजेक्षन" (एकल मूल्य में नीचे एक गणनीय की सामग्री को कम करने के लिए इस सटीक ऑपरेशन के लिए विशेष रूप से है:

results.reduce(0) do |count, value| 
    count + (value["name"]=="Bill" && value["day"] == "2012-08-15" ? value["calls"].to_i : 0) 
end 

नाइस यहाँ writeup: "Understanding map and reduce"

0

या किसी अन्य संभव तरीके से, लेकिन एक छोटे से बदतर है, इंजेक्षन का उपयोग कर:

results.inject(0) { |number_of_calls, arr_element| arr_element['day'] == '2012-08-15' ? number_of_calls += 1 : number_of_calls += 0 } 

नोट आप प्रत्येक चरण में NUMBER_OF_CALLS स्थापित करने के लिए है, अन्यथा यह काम नहीं करेगा, उदाहरण के लिए यह काम नहीं करता:

p results.inject(0) { |number_of_calls, arr_element| number_of_calls += 1 if arr_element['day'] == '2012-08-15'} 
संबंधित मुद्दे