সদৃশ কীগুলি ওভাররাইট না করে দুটি হ্যাশকে মার্জ করার জন্য কি সহজ বা মার্জিত উপায় আছে?
এটি হ'ল মূল হ্যাশটিতে কীটি উপস্থিত থাকলে আমি এর মান পরিবর্তন করতে চাই না।
সদৃশ কীগুলি ওভাররাইট না করে দুটি হ্যাশকে মার্জ করার জন্য কি সহজ বা মার্জিত উপায় আছে?
এটি হ'ল মূল হ্যাশটিতে কীটি উপস্থিত থাকলে আমি এর মান পরিবর্তন করতে চাই না।
উত্তর:
আপনি দুটি হ্যাশ আছে, options
এবং defaults
, এবং আপনি একত্রীকরণ করতে চান defaults
মধ্যে options
একত্রীকরণ: বিদ্যমান কী মুছে যাওয়ার ছাড়া, আপনি কি সত্যিই কাজ করতে চান বিপরীত হয় options
মধ্যে defaults
:
options = defaults.merge(options)
বা, আপনি যদি রেলগুলি ব্যবহার করেন তবে আপনি এটি করতে পারেন:
options.reverse_merge!(defaults)
reverse_merge!
রেল 5.1
যদি আপনার সমস্যাগুলি হয় যে আসল হ্যাশ এবং দ্বিতীয়টির দুটিতে নকল কী থাকতে পারে এবং আপনি কোনও দিকই ওভাররাইট করতে চান না, তবে আপনাকে কোনও ধরণের সংঘর্ষের চেক এবং হ্যান্ডলিংয়ের সাথে একটি সাধারণ ম্যানুয়াল মার্জ করতে হবে:
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 থেকে মানটি প্রদান করে। আপনার ফলাফলটি সত্যিকারের হতে চান তা নির্ভর করে।
এখানে আপনি নিজের 2 টি হ্যাশ মার্জ করতে পারেন reverse_merge
order = {
id: 33987,
platform: 'web'
}
user = {
name: 'Jhon Doe',
email: 'jhon.doe@gmail.com'
}
newHash = oder.reverse_merge!(user)
render json: { data: newHash, status: 200 }
আপনি যদি দুটি হ্যাশ একত্রীকরণ করতে চান 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? })