আমি রুবিতে ওভাররাইট করা ডুপ্লিকেট কী ছাড়া দুটি হ্যাশ কীভাবে মার্জ করতে পারি?


140

সদৃশ কীগুলি ওভাররাইট না করে দুটি হ্যাশকে মার্জ করার জন্য কি সহজ বা মার্জিত উপায় আছে?

এটি হ'ল মূল হ্যাশটিতে কীটি উপস্থিত থাকলে আমি এর মান পরিবর্তন করতে চাই না।


আপনি কি সত্যই অ্যারে (উদাহরণস্বরূপ: ['ক', 'বি', 'সি']) বা হ্যাশগুলি বোঝাতে চান (যেমন: {'a' => 1, 'বি' => 2, 'সি' => 3}) ?
অ্যালেক্স রিজনার

দুঃখিত, আমি হ্যাশ সম্পর্কে কথা বলছিলাম :)
ক্লোদিও অ্যাকিয়েরেসি

উত্তর:


232

আপনি দুটি হ্যাশ আছে, optionsএবং defaults, এবং আপনি একত্রীকরণ করতে চান defaultsমধ্যে optionsএকত্রীকরণ: বিদ্যমান কী মুছে যাওয়ার ছাড়া, আপনি কি সত্যিই কাজ করতে চান বিপরীত হয় optionsমধ্যে defaults:

options = defaults.merge(options)

বা, আপনি যদি রেলগুলি ব্যবহার করেন তবে আপনি এটি করতে পারেন:

options.reverse_merge!(defaults)

সম্পূর্ণরূপে সম্মত হন, রিভার্স_মিটারের জন্য অনেক ধন্যবাদ! পদ্ধতিটি এটি জানত না :)
ক্লাদিও অ্যাকিয়েরেসি

কেন এখানে প্রথম বন্ধনী প্রয়োজন? আপনি ঠিক ডিফল্ট করতে পারবেন না merge
দোনাতো

1
reverse_merge!রেল 5.1
মিরভ - ম্যাট

@ মিরভ-ম্যাট - আমি হ্রাসের বিজ্ঞপ্তি দেখতে পাচ্ছি না। apidock.com/rails/v6.0.0/Hash/reverse_merge%21
Kshitij

17

বিদ্যমান মানগুলি ওভাররাইট না করে বা হ্যাশটিকে পুনরায় স্বাক্ষর না করে হ্যাশগুলিকে মার্জ করার জন্য স্ট্যান্ডার্ড রুবি লাইব্রেরিতে একটি উপায় রয়েছে।

important_hash.merge!(defaults) { |key, important, default| important }

3

যদি আপনার সমস্যাগুলি হয় যে আসল হ্যাশ এবং দ্বিতীয়টির দুটিতে নকল কী থাকতে পারে এবং আপনি কোনও দিকই ওভাররাইট করতে চান না, তবে আপনাকে কোনও ধরণের সংঘর্ষের চেক এবং হ্যান্ডলিংয়ের সাথে একটি সাধারণ ম্যানুয়াল মার্জ করতে হবে:

hash2.each_key do |key|
  if ( hash1.has_key?(key) )
       hash1[ "hash2-originated-#{key}" ] = hash2[key]
  else
       hash1[key]=hash2[key]
  end
end

স্পষ্টতই, এটি অত্যন্ত প্রাথমিক এবং অনুমান করে যে হ্যাশ 1 এর কাছে "হ্যাশ 2-উত্সাহিত-যাই হোক না কেন" নামক কোনও কী নেই - আপনি কীতে কোনও সংখ্যা যুক্ত করা ভাল তাই এটি কী 1, কী 2 ইত্যাদি হয়ে যাবে যতক্ষণ না আপনি আঘাত করবেন ইতিমধ্যে হ্যাশ 1 এ নেই এমন একটি। এছাড়াও, আমি কয়েক মাসের জন্য কোনও রুবি করিনি যাতে এটি সম্ভবত সিনথেটিকভাবে সঠিক নয়, তবে আপনাকে গিস্টটি পেতে সক্ষম হওয়া উচিত।

বিকল্প হিসাবে কীটির মানটিকে অ্যারে হিসাবে পুনরায় সংজ্ঞা দেয় যাতে হ্যাশ 1 [কী] হ্যাশ 1 থেকে আসল মান এবং হ্যাশ 2 থেকে মানটি প্রদান করে। আপনার ফলাফলটি সত্যিকারের হতে চান তা নির্ভর করে।


কী কীভাবে উভয় কী রাখে না, তবে একই কীটির মান যুক্ত করা যায়?
টম কেসি চিউ

1
@ টোম.কে.সি.সিহু এটি এমন পরিস্থিতিতে নির্ভর করবে যে আমরা প্রশ্নটি থেকে বিচার করতে পারি না - হ্যাশ 1 এর মানগুলি যদি স্ট্রিং এবং হ্যাশ 2 সংখ্যার হয়? কিছু ক্ষেত্রে এটি কার্যকর একটি বিকল্প হতে পারে, তবে প্রায়শই এটি সমস্যার কারণ হতে পারে- মানগুলির জন্য তালিকা ব্যবহারের পরামর্শ এটি প্রায় পরিষ্কারভাবে কাজ করে।
glenatron


0

আপনি যদি দুটি হ্যাশ একত্রীকরণ করতে চান optionsএবং defaultsগন্তব্য হ্যাশ ওভাররাইট না করে আপনি selectকীটি ইতিমধ্যে গন্তব্য হ্যাশটিতে উপস্থিত আছে কিনা তা পরীক্ষা করে দেখতে পারেন। এখানে রেল ছাড়া খাঁটি রুবির সমাধান রয়েছে:

options  = { "a" => 100, "b" => 200 }
defaults = { "b" => 254, "c" => 300 }
options.merge!(defaults.select{ |k,_| not options.has_key? k })

# output
# => {"a"=>100, "b"=>200, "c"=>300}

অথবা যদি কীটি উপস্থিত থাকে তবে এতে রয়েছে nilএবং আপনি এটি ওভাররাইট করতে চান:

options.merge!(defaults.select{ |k,_| options[k].nil? })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.