मैं रूबी में हैश मूल्यों द्वारा हैश की एक सरणी के भीतर कैसे खोज करूं?


234

मेरे पास हैश की एक सरणी है, @ फादर।

a_father = { "father" => "Bob", "age" =>  40 }
@fathers << a_father
a_father = { "father" => "David", "age" =>  32 }
@fathers << a_father
a_father = { "father" => "Batman", "age" =>  50 }
@fathers << a_father 

मैं इस सरणी को कैसे खोज सकता हूं और हैश की एक सरणी लौटा सकता हूं जिसके लिए एक ब्लॉक सही है?

उदाहरण के लिए:

@fathers.some_method("age" > 35) #=> array containing the hashes of bob and batman

धन्यवाद।

जवाबों:


419

आप Enumerable # select (जिसे भी कहते हैं find_all) की तलाश कर रहे हैं :

@fathers.select {|father| father["age"] > 35 }
# => [ { "age" => 40, "father" => "Bob" },
#      { "age" => 50, "father" => "Batman" } ]

दस्तावेज़ीकरण के अनुसार, "यह एक सरणी देता है जिसमें [इस मामले में, इस मामले में @fathers] के सभी तत्व शामिल हैं, जिसके लिए ब्लॉक गलत नहीं है।"


22
ओह! आप पहले वाले थे! मेरा उत्तर और +1 हटाना।
मिलान नोवा

20
एक नोट के रूप में, यदि आप केवल एक एकल (पहले वाला) खोजना चाहते हैं, तो आप @fathers.find {|father| father["age"] > 35 }इसके बजाय उपयोग कर सकते हैं ।
लेह मैककुलोच

1
क्या यह संभव है कि जहां यह हैश के मूल सरणी में पाया गया था के सूचकांक को वापस करना?
इयान वार्नर

1
@IanWarner हां। मेरा सुझाव है कि Enumerable मॉड्यूल के लिए डॉक्स देखना। यदि आप अभी भी इसका पता नहीं लगा सकते हैं, तो एक नया प्रश्न पोस्ट करें।
जॉर्डन रनिंग

मैंने अभी यह इंडेक्स = ARRAY.index {| ज | h [: code] == ARRAY ["कोड"]}
इयान वार्नर

198

यह पहला मैच लौटेगा

@fathers.detect {|f| f["age"] > 35 }

6
मैं इसे पसंद करता हूं #select- लेकिन सभी आपके उपयोग के मामले में जाते हैं। #detectवापस आ जाएगी nilअगर कोई मुकाबला नहीं, पाया जाता है, जबकि #select, में @ जॉर्डन के जवाब है, वापस आ जाएगी []
TJ Biddle

13
आप एक अधिक पठनीय कोड findके detectलिए भी उपयोग कर सकते हैं
Alter लागोस

8
findहालांकि, रेल में भ्रमित हो सकते हैं।
user12341234

5
selectऔर detectसमान नहीं हैं, selectपूरे सरणी को ट्रांसवर्स करेगा, जबकि detectपहला मैच मिलते ही बंद हो जाएगा। आप एक मैच के लिए देख रहे हैं @fathers.select {|f| f["age"] > 35 }.firstबनाम @fathers.detect {|f| f["age"] > 35 } प्रदर्शन और पठनीयता के लिए, अपने वोट के लिए चला जाता हैdetect
नवीद

35

अगर आपकी सरणी दिखती है

array = [
 {:name => "Hitesh" , :age => 27 , :place => "xyz"} ,
 {:name => "John" , :age => 26 , :place => "xtz"} ,
 {:name => "Anil" , :age => 26 , :place => "xsz"} 
]

और आप यह जानना चाहते हैं कि क्या कुछ मूल्य आपके सरणी में पहले से मौजूद है। विधि का प्रयोग करें

array.find {|x| x[:name] == "Hitesh"}

यह वस्तु वापस आ जाएगी यदि हितेश नाम में मौजूद है अन्यथा रिटर्न नील


यदि नाम की तरह लोअरकेस था "hitesh", तो यह हैश को वापस नहीं करेगा। हम इस तरह के मामलों में कैसे केसिंग के लिए भी जिम्मेदार हो सकते हैं?
अर्जुन

2
आप कुछ का उपयोग कर सकते हैं। array.find {| x | x [: नाम] .downcase == "हितेश" .downcase}
हितेश रनौत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.