Sorcus
Sorcus. A New Beginning.
- Регистрация
- 10 Июл 2011
- Сообщения
- 513
- Реакции
- 1.002
- Автор темы
- #11
Все-таки не мог не доделать...
Собственно код работает, мержит не только чистые хеши, но и хеши, вложенные в массивы.
А так же заменяет nil значения на шаблонный хэш/массив, если он там должен быть ( см. 3-й comments в hash_two ).
Вариант возможно не окончательный, т.к. я не знаю, способен ли скрипт обработать любые хеши.
Ну и если есть советы по улучшению кода - отписывайтесь. Ибо мой вариант скорее похож на костыль.
Если кому-то пригодится - отписывайтесь о результатах и багах. Спасибо всем за помощь. Особенно @Nei .
Код:
hash_one = {
'title' => nil,
'description' => nil,
'meta' => {
'seo_title' => nil,
'seo_description' => nil
},
'comment_list' => [
{
'comments' => [
{
'author' => nil,
'date' => nil,
'comment' => nil
}
],
'count' => nil
}
],
'content' => nil
}
hash_two = {
'title' => 'Hello World!',
'meta' => {
'seo_title' => true
},
'comment_list' => [
{
'comments' => [
{
'author' => 'Admin',
'comment' => 'Default'
}
]
},
{
'comments' => [
{
'date' => '123'
}
]
},
{
'comments' => nil
}
]
}
class Hash
def deep_merge(hash)
hash.merge(self) do |key, value_one, value_two|
if value_two.is_a?(Hash)
value_one.merge!(value_two)
elsif value_two.is_a?(Array)
array = Array.new
value_two.each do |value|
array << value.deep_merge(value_one[0].dup)
end
array
elsif value_two.is_a?(NilClass)
value_one unless value_one.is_a?(NilClass)
else
value_two
end
end
end
end
p hash_two.deep_merge(hash_one)
А так же заменяет nil значения на шаблонный хэш/массив, если он там должен быть ( см. 3-й comments в hash_two ).
Вариант возможно не окончательный, т.к. я не знаю, способен ли скрипт обработать любые хеши.
Ну и если есть советы по улучшению кода - отписывайтесь. Ибо мой вариант скорее похож на костыль.
Если кому-то пригодится - отписывайтесь о результатах и багах. Спасибо всем за помощь. Особенно @Nei .
Последнее редактирование: