bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Замена значения в Hash?

Здравствуйте. Как правильно сделать такую замену, приведу примером, а то как объяснить сложно.
есть вот входящий массив,
[{ one: 1, two:2, norm: 1 }, { one: 3, two:2, norm: 3 } ]
нужно сделать исходящий hash
{{:id=>0, :one=>1, :two=>2}=>[{:one=>1, :two=>2, :norm=>1, :index=>0}, {:one=>1, :two=>2, :norm=>1, :index=>2}], {:id=>5, :one=>3, :two=>2}=>[{:one=>3, :two=>2, :norm=>3, :index=>1}]}

start_hash = [{ one: 1, two:2, norm: 1 }, { one: 3, two:2, norm: 3 }, { one: 1, two:2, norm: 1 } ]

# Сохраняем индекс - это нужно в рамках логики что бы выводить индекс, где есть ошибка
# ??? Возможно эту операцию можно как-то упростить, или в другой конструкции использовать, что бы избавится от этого лишнего map
start_hash.map.with_index { | o, i | o.merge!( index: i ) }

# Группируем hash и добавляем пустой ключ { :id }
group_hash = start_hash.group_by { | o | { id: 0, one: o[:one], two: o[:two] } }

p group_hash
#{{:id=>0, :one=>1, :two=>2}=>[{:one=>1, :two=>2, :norm=>1, :index=>0}, {:one=>1, :two=>2, :norm=>1, :index=>2}], {:id=>0, :one=>3, :two=>2}=>[{:one=>3, :two=>2, :norm=>3, :index=>1}]}

# Находим нужное значение
find_hash = group_hash.select { | k, v | k[ :one ] == 3 &&  k[ :two ] == 2 }

p find_hash
# {{:id=>0, :one=>3, :two=>2}=>[{:one=>3, :two=>2, :norm=>3, :index=>1}]}

# ID в ключе для выбранного значения
# !!!
# Вот здесь можно как-то по другому написать выходит как-то сложно
# Проблема как достучатся к {{:id=>0, :one=>3, :two=>2}=>[{:one=>3, :two=>2, :norm=>3}]}
# что бы не переводить ключи в массив? и получить

find_hash.keys[0][ :id ] = 5

# На виходе получем правильный результат
p group_hash
# {{:id=>0, :one=>1, :two=>2}=>[{:one=>1, :two=>2, :norm=>1, :index=>0}, {:one=>1, :two=>2, :norm=>1, :index=>2}], {:id=>5, :one=>3, :two=>2}=>[{:one=>3, :two=>2, :norm=>3, :index=>1}]}
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы