I am working on a Ruby gem to pull data from the Wikidata API. The data is deeply nested, as it contains a lot of repetition.
I have written a piece of Ruby (sans Rails) code that enables an array of hashes to be merged together, with any duplicate key-value pairs being stored as an array under the same key.
For example:
[{:a=>1, :b=>2}, {:b=>3, :c=>4}, {:d=>5, :a=>6}].merge_hashes
gives:
{:a=>[1, 6], :b=>[2, 3], :c=>4, :d=>5}
I began with the following:
class Array
def merge_hashes
raise StandardError.new "Array is not an Array of Hashes" unless self.all? {|e| e.is_a? Hash}
self.each_with_object({}) do |el, h|
el.each do |k, v|
if h[k].nil?
h[k] = v
else
h[k] = Array.new([h[k]]) << v
h[k] = h[k].flatten
end
end
end
end
end
And refactored to:
class Array
def merge_hashes
raise StandardError.new "Array is not an Array of Hashes" unless self.all? {|e| e.is_a? Hash}
self.each_with_object({}) { |el, h| el.each { |k, v| h[k].nil? ? h[k] = v : h[k] = (Array.new([h[k]]) << v).flatten } }
end
end
Are there any other improvements I could make? Is that an acceptable exception to throw?