में महत्वपूर्ण मूल्य जोड़े के हैश करने के लिए एक मॉडल है कि एक मेज से सभी मूल्यों देता है, मैं कैसे बदल जाएगा कि नाम मान युग्मसरणी रूबी
{column_value => column_value}
उदा के हैश तक
{'first' => 1, 'second' => 2, 'third' => 3}
में महत्वपूर्ण मूल्य जोड़े के हैश करने के लिए एक मॉडल है कि एक मेज से सभी मूल्यों देता है, मैं कैसे बदल जाएगा कि नाम मान युग्मसरणी रूबी
{column_value => column_value}
उदा के हैश तक
{'first' => 1, 'second' => 2, 'third' => 3}
निम्नलिखित दृष्टिकोण यथोचित कॉम्पैक्ट, अभी तक अभी भी पठनीय है
[{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}]
(: आईडी और नाम निर्दिष्ट): करने के लिए
def join_rows(rows, key_column, value_column)
result = {}
rows.each { |row| result[row[key_column]] = row[value_column] }
result
end
उपयोग:
>> rows = [{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}]
>> join_rows(rows, :name, :id)
=> {"third"=>3, "second"=>2, "first"=>1}
या, यदि आप एक एक लाइनर हैं:
>> rows.inject({}) { |result, row| result.update(row[:name] => row[:id]) }
=> {"third"=>3, "second"=>2, "first"=>1}
o = Hash.new
a = [{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}]
a.each {|h| o[h[:name]] = h[:id] }
puts o #{'third' => 3, 'second' => 2, 'first' => 1}
आप एक पंक्ति में कर सकते हैं inject
साथ:
a = [{:id => 1, :name => 'first'}, {:id => 2, :name => 'second'}, {:id => 3, :name => 'third'}]
a.inject({}) { |sum, h| sum.merge({ h[:name] => h[:id]}) }
# => {"third" => 3, "second" => 2, "first" => 1}
मुझे आश्चर्य है कि अगर यह एक पंक्ति ... – Christopher
में किया जा सकता है @ क्रिस्टोफर: हाँ, यह एक लाइनर के साथ भी किया जा सकता है। मैंने एक विकल्प के रूप में एक-लाइनर समाधान के साथ अपना जवाब अपडेट किया। –
आप निश्चित रूप से कर सकते हैं; 'इंजेक्ट 'का उपयोग करके मेरा जवाब देखें। –