আমি রুবিতে হ্যাশ মানগুলি দিয়ে হ্যাশগুলির একটি অ্যারের মধ্যে কীভাবে অনুসন্ধান করব?


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

আপনি অঙ্কের জন্য নির্বাচন করুন # নির্বাচন (এটিও বলা হয় 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
@ আইয়ান ওয়ার্নার হ্যাঁ আমি এনামিউরেবল মডিউলটির জন্য ডকগুলিতে সন্ধান করার পরামর্শ দিচ্ছি। আপনি যদি এখনও এটি বের করতে না পারেন তবে একটি নতুন প্রশ্ন পোস্ট করুন।
জর্ডান

আমি সবে এই সূচকটি করেছি = ARRAY.index {| এইচ | এইচ [: কোড] == এআরএই ["কোড"]}
ইয়ান ওয়ার্নার

198

এটি প্রথম ম্যাচে ফিরে আসবে

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

6
আমি এটিকে অগ্রাধিকার দিচ্ছি #select- তবে সব আপনার ব্যবহারের ক্ষেত্রে যায়। কোনও মিল না পাওয়া গেলে #detectফিরে আসবে nil, যখন #select@ জর্ডানের উত্তরে, ফিরে আসবে []
টিজে বিডল

13
আপনি আরও পঠনযোগ্য কোডের findপরিবর্তে ব্যবহার করতে পারেনdetect
এলটোর লাগোস

8
findতবে রেলের মধ্যে বিভ্রান্তি পেতে পারে।
ব্যবহারকারী 12341234

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
আপনি যেমন কিছু ব্যবহার করতে পারেন। অ্যারে.ফাইন্ড {| এক্স | x [: নাম] .ডাউনকেস == "হিতেশ" .ডাউনস}
হিতেশ রানাউত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.