Answer the question
In order to leave comments, you need to log in
Replacing a value in a Hash?
Hello. How to make such a replacement, I will give an example, but it is difficult to explain how.
there is an incoming array,
[{ one: 1, two:2, norm: 1 }, { one: 3, two:2, norm: 3 } ]
you need to make an outgoing 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}]}
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question