মিলে যাওয়া মান সহ একটি হ্যাশ কী কীভাবে সন্ধান করবেন


198

আমি নীচের ক্লায়েন্টদের হ্যাশ দিয়েছি, আমি ক্লায়েন্ট_আইডের সাথে মেলে রাখতে চাইলে কীটি পেতে একটি দ্রুত রুবি উপায় আছে (মাল্টি-লাইন স্ক্রিপ্ট না লিখে)? যেমন কীভাবে চাবি পাবেন client_id == "2180"?

clients = {
  "yellow"=>{"client_id"=>"2178"}, 
  "orange"=>{"client_id"=>"2180"}, 
  "red"=>{"client_id"=>"2179"}, 
  "blue"=>{"client_id"=>"2181"}
}

উত্তর:


176

আপনি গণ্য # নির্বাচন ব্যবহার করতে পারেন :

clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]

নোট করুন যে ফলাফলটি সমস্ত মিলে যাওয়া মানগুলির একটি অ্যারে হবে, যেখানে প্রতিটি কী এবং মানের অ্যারে।


22
মধ্যে পার্থক্য @Coderama findএবং selectযে findআয় প্রথম ম্যাচ এবং select(যা দ্বারা ওরফে অন্য findAll) সমস্ত ম্যাচ ফেরৎ।
ড্যানিয়েল ভ্যান্ডারসলুইস

আমি দেখতে পাচ্ছি, সুতরাং যেখানে একাধিক ম্যাচ আছে সেই উদাহরণগুলির জন্য এটি নিরাপদ বিকল্প হবে।
কোড্রামামা

1
এটি invertকেবল একটি আইটেম সন্ধান করার জন্য একটি সম্পূর্ণ নতুন হ্যাশ তৈরি করার চেয়ে ভাল (কল করে )।
হিজাজি

3
নোট করুন যে রুবি ১.৯.৩ হিসাবে এটি ম্যাচগুলির সাথে একটি নতুন হ্যাশ ফিরিয়ে দেবে। এটি কোনও অ্যারে ফিরিয়ে দেবে না, যেমন এটি রুবি <= 1.8.7 তে ব্যবহৃত ছিলclients.select{|key, hash| hash["client_id"] == "2180" } # => {"orange"=>{"client_id"=>"2180"}}
অ্যান্ড্রুস

কী (গুলি) পেতে, সহজেই লিখুনclients.select{|key, hash| hash["client_id"] == "2180" }.keys
মিরর 318

407

রুবি ১.৯ এবং ততোধিক:

hash.key(value) => key

রুবি ১.৮ :

আপনি ব্যবহার করতে পারেন hash.index

hsh.index(value) => key

প্রদত্ত মানের জন্য কীটি প্রদান করে। যদি পাওয়া না যায় তবে ফিরে আসে nil

h = { "a" => 100, "b" => 200 }
h.index(200) #=> "b"
h.index(999) #=> nil

সুতরাং পেতে "orange", আপনি কেবল ব্যবহার করতে পারেন:

clients.key({"client_id" => "2180"})

2
হ্যাশগুলির একাধিক কী থাকলে এটি এক ধরণের অগোছালো হয়ে উঠবে, কারণ আপনাকে পুরো হ্যাশটি দিতে হবে index
ড্যানিয়েল ভ্যান্ডারসলুইস

51
Hash#indexHash#keyরুবি ১.৯
বিক্রান্ত চৌধুরী চৌধুরী

12
মনে রাখবেন এটি কেবল প্রথম ম্যাচটি ফেরত দেয়, যদি একই মানের সাথে একাধিক হ্যাশ জুড়ি থাকে তবে এটি কোনও মিলের মান সহ প্রথম কীটি ফিরিয়ে দেবে।
মাইক ক্যাম্পবেল

47

আপনি হ্যাশটি উল্টাতে পারেন। clients.invert["client_id"=>"2180"]আয়"orange"


3
এটি করার মতো এটিও একটি চতুর উপায় (কারণ এটি সংক্ষিপ্ত) বলে মনে হচ্ছে!
কোড্রামামা

আমার ফর্ম অ্যারেগুলির জন্য এটিই দরকার (নির্বাচিত বাক্সগুলির জন্য) যা পিছনের দিকে হ্যাশ তৈরি করে
জোসেফ লে ব্রিচ

22

আপনি hashname.key (মূল্যবান নাম) ব্যবহার করতে পারেন

বা, একটি বিপরীত ক্রম হতে পারে be new_hash = hashname.invertআপনাকে এমন একটি উপহার দেবে new_hashযা আপনাকে প্রচলিতভাবে আরও কিছু করতে দেয়।


3
এটি রুবি এর সাম্প্রতিক সংস্করণগুলিতে (1.9+) করার সঠিক উপায়।
লার্স হগসেট

#invertএই ক্ষেত্রে একটি সত্যই খারাপ ধারণা, যেহেতু আপনি কেবল কোনও চাবি সন্ধানের প্রয়োজনে নিক্ষেপ হ্যাশ অবজেক্টটির জন্য মূলত মেমরি বরাদ্দ করছেন। হ্যাশের আকারের উপর নির্ভর করে এর মারাত্মক পারফরম্যান্সের প্রভাব রয়েছে
ড। স্ট্রেনজয়েভ

15

এটা চেষ্টা কর:

clients.find{|key,value| value["client_id"] == "2178"}.first

4
এটি যদি ব্যর্থ হয় তবে এটি ব্যর্থ হবে, কারণ আপনি কল করতে পারবেন না you
শ্রোকওয়েল

1
যদি রেল ব্যবহার .try(:first)করে .firstথাকেন তবে ব্যতিক্রমগুলি এড়াতে আপনি ব্যবহার করতে পারেন (যদি আপনি এটির মূল্য অনুপস্থিত হওয়ার সম্ভাবনা প্রত্যাশা করছেন)।
অ্যারন-কোডিং

2
মধ্যে Ruby 2.3.0 +আপনি ব্যবহার করতে পারেন নিরাপদ ন্যাভিগেটর &.first নীল ব্যতিক্রম থেকে বিরত ব্লক শেষে
গগন Gami


6

দস্তাবেজগুলি থেকে:

  • (অবজেক্ট?) সনাক্ত করুন (ifnone = শূন্য) {| আপত্তি | ...
  • (অবজেক্ট?) সন্ধান (ifnone = শূন্য) {| আপত্তি | ...
  • (অবজেক্ট) সনাক্ত করুন (ifnone = শূন্য)
  • (অবজেক্ট) সন্ধান করুন (ifnone = শূন্য)

এনামে ব্লক করতে প্রতিটি প্রবেশ পাস করে। প্রথমটি প্রদান করে যার জন্য ব্লকটি মিথ্যা নয়। যদি কোনও বস্তু মেলে না, ifnone কে কল করে এবং নির্দিষ্ট করে নির্দিষ্ট করা হলে এর ফলাফল প্রদান করে বা অন্যথায় শূন্য করে।

যদি কোনও ব্লক না দেওয়া হয় তবে পরিবর্তে একটি গণক ফেরত দেওয়া হবে।

(1..10).detect  {|i| i % 5 == 0 and i % 7 == 0 }   #=> nil
(1..100).detect {|i| i % 5 == 0 and i % 7 == 0 }   #=> 35

এটি আমার পক্ষে কাজ করেছে:

clients.detect{|client| client.last['client_id'] == '2180' } #=> ["orange", {"client_id"=>"2180"}] 

clients.detect{|client| client.last['client_id'] == '999999' } #=> nil 

দেখুন: http://rubydoc.info/stdlib/core/1.9.2/ গণনামূলক#find-instance_ ਯਾਦ


3

কোনও নির্দিষ্ট মানের জন্য কীটি সন্ধান করার সর্বোত্তম উপায় হ্যাশের জন্য উপলব্ধ কী পদ্ধতিটি ব্যবহার করা ....

gender = {"MALE" => 1, "FEMALE" => 2}
gender.key(1) #=> MALE

আমি আশা করি এটি আপনার সমস্যার সমাধান করে ...


2

আরেকটি পদ্ধতির চেষ্টা করব যা হ'ল ব্যবহার করে #map

clients.map{ |key, _| key if clients[key] == {"client_id"=>"2180"} }.compact 
#=> ["orange"]

এটি প্রদত্ত মানের সমস্ত ঘটনা ফিরিয়ে দেবে। আন্ডারস্কোরটির অর্থ হ'ল আমাদের কী-এর মান চারদিকে বহন করার দরকার নেই যাতে এটি ভেরিয়েবলের জন্য বরাদ্দ করা হয় না। মানগুলিতে মেলে না থাকলে অ্যারেতে নীল থাকবে that's এজন্য আমি #compactশেষে রেখেছি ।


1

প্রদত্ত মানের কীগুলি খুঁজে পাওয়ার সহজ উপায় এখানে:

    clients = {
      "yellow"=>{"client_id"=>"2178"}, 
      "orange"=>{"client_id"=>"2180"}, 
      "red"=>{"client_id"=>"2179"}, 
      "blue"=>{"client_id"=>"2181"}
    }

    p clients.rassoc("client_id"=>"2180")

... এবং প্রদত্ত কীটির মান সন্ধান করতে:

    p clients.assoc("orange") 

এটি আপনাকে মূল-মান জুটি দেবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.