একক হ্যাশগুলিতে হ্যাশগুলির অ্যারে ম্যাপিং করে রেয়েল


94

আমার মতো হ্যাশগুলির একটি অ্যারে রয়েছে:

 [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]

এবং আমি এটির মত একক হ্যাশ এ এটি মানচিত্র করার চেষ্টা করছি:

{"testPARAM2"=>"testVAL2", "testPARAM1"=>"testVAL1"}

আমি এটি ব্যবহার করে অর্জন করেছি

  par={}
  mitem["params"].each { |h| h.each {|k,v| par[k]=v} } 

তবে আমি ভাবছিলাম যে আরও মুশকিলভাবে এটি করা সম্ভব (স্থানীয়ভাবে স্থানীয় ভেরিয়েবল ব্যবহার না করে)।

কিভাবে আমি এটি করতে পারব?

উত্তর:


164

আপনি রচনা করতে পারেন Enumerable#reduceএবং Hash#mergeআপনি যা করতে চান তা সম্পাদন করতে।

input = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
input.reduce({}, :merge)
  is {"testPARAM2"=>"testVAL2", "testPARAM1"=>"testVAL1"}

এর অ্যারের ধরণ হ্রাস করার মতো এটির প্রতিটি উপাদানগুলির মধ্যে একটি মেথড কল স্টিক করা।

উদাহরণস্বরূপ [1, 2, 3].reduce(0, :+)বলা 0 + 1 + 2 + 3এবং দেয় মত হয় 6

আমাদের ক্ষেত্রে আমরা অনুরূপ কিছু করি, তবে মার্জ ফাংশনটির সাথে, যা দুটি হ্যাশকে একীভূত করে।

[{:a => 1}, {:b => 2}, {:c => 3}].reduce({}, :merge)
  is {}.merge({:a => 1}.merge({:b => 2}.merge({:c => 3})))
  is {:a => 1, :b => 2, :c => 3}

4
ধন্যবাদ, এটি একটি দুর্দান্ত উত্তর :) খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে!
বার্ট প্ল্যাটাক

42
ইনপুট.রেডস (&: মার্জ) যথেষ্ট।
redgetan

@redgetan এর থেকে আলাদা input.reduce(:merge)কি?
ডেভিড ভ্যান জেস্ট 12'15

4
@ ডেভিড ভ্যান জেস্ট: এক্ষেত্রে তারা সমান। এখানে ব্যবহৃত ইউনারী অ্যাম্পারস্যান্ড প্রতীকটির বাইরে একটি ব্লক তৈরি করে। তবে কমানোর একটি বিশেষ কেস রয়েছে যা প্রতীক গ্রহণ করে। উদাহরণটি সহজ করার জন্য আমি অ্যানারি অ্যাম্পারস্যান্ড অপারেটরটি এড়াতে চেয়েছিলাম, তবে রেডগেটান সঠিক যে প্রাথমিক মানটি এই ক্ষেত্রে optionচ্ছিক।
সিজেভেয়াল

4
মনে রাখবেন যে আপনি যদি এটির merge!পরিবর্তে ব্যবহার করেন mergeতবে প্রথম হ্যাশটি পরিবর্তন করবে (যা আপনি চাইবেন না) তবে প্রতিটি নতুন সংযুক্তির জন্য মধ্যস্থতাকারী হ্যাশ তৈরি করবেন না।
ফ্রোগজ

51

কেমন:

h = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
r = h.inject(:merge)

এই স্কিমটি কার্যকরভাবে জোশুয়া জবাব দিয়েছিল বলে একই, তবে বারবার সমস্ত হ্যাশগুলিতে # নিমজ্জন (পদ্ধতির নামটি প্রতীক হিসাবে পাস হয়েছে) প্রয়োগ করে (আইটেমগুলির মধ্যে অপারেটর ইনজেকশন হিসাবে ইনজেকশন ভাবেন)। পড়ুন #inject
শিগইয়া

4
কীভাবে আসুন h.inject (&: মার্জ) এর মতো, আমাদের অ্যাম্পারস্যান্ডের দরকার নেই?
দোনাতো

4
কারণ ইনজেকশন পদ্ধতিটি একটি নামকে প্যারামিটার হিসাবে গ্রহণ করে পদ্ধতির নাম হিসাবেও ব্যাখ্যা করা যায়। এটি ইনজেকশনের বৈশিষ্ট্য।
শিগইয়া


0

এখানে আপনি হয় ইনজেকশন ব্যবহার করতে পারেন বা এনুম্যুয়েবল ক্লাস থেকে হ্রাস করতে পারেন কারণ এরা উভয়ই একে অপরের এলিয়াস তাই কোনওটিরও কার্যকারিতা সুবিধা নেই benefit

 sample = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]

 result1 = sample.reduce(:merge)
 # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}

 result2 = sample.inject(:merge)
 # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.