class NiceHash
def NiceHash.set_values(hash_array, hash_values)
hashv = Hash.new()
if hash_array.is_a?(Hash) and hash_array.size > 0
if hash_values.is_a?(Hash) and hash_values.keys.flatten.size != hash_values.keys.size
hash_values.each do |k,v|
if k.is_a?(Array)
k.each do |kvk|
if hash_array.key?(kvk)
hash_array[kvk] = hash_values[k]
end
end
end
end
end
hash_array.each do |k, v|
same_values_key_done = false
if k.is_a?(Array)
k.each do |kvk|
if hash_values.keys.include?(kvk)
hashv[k] = hash_values[kvk]
same_values_key_done = true
end
end
end
unless same_values_key_done
if hash_values.keys.include?(k)
hashv[k] = hash_values[k]
elsif v.is_a?(Array)
if hash_values.has_rkey?('\.') new_hash_values = {}
hash_values.each do |kk,vv|
if kk.to_s.match?(/^#{k}\./)
kk = kk.to_s.gsub(/^#{k}\./, '').to_sym
new_hash_values[kk] = vv
end
end
hashv[k] = NiceHash.set_values(v, new_hash_values)
else
hashv[k] = NiceHash.set_values(v, hash_values)
end
elsif v.is_a?(Hash)
if hash_values.has_rkey?('\.') new_hash_values = {}
hash_values.each do |kk,vv|
if kk.to_s.match?(/^#{k}\./)
kk = kk.to_s.gsub(/^#{k}\./, '').to_sym
new_hash_values[kk] = vv
end
end
hashv[k] = NiceHash.set_values(v, new_hash_values)
else
hashv[k] = NiceHash.set_values(v, hash_values)
end
else
hashv[k] = v
end
end
end
hash_values.each do |k, v|
hashv = NiceHash.set_nested(hashv, k, v, true) if k.is_a?(Hash)
end
return hashv
elsif hash_array.is_a?(Array) and hash_array.size > 0
hashv = Array.new
hash_array.each do |r|
hashv << NiceHash.set_values(r, hash_values)
end
return hashv
else
return hash_array
end
end
end