B
B
Bogdan2017-09-26 15:07:54
Ruby on Rails
Bogdan, 2017-09-26 15:07:54

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 question

Ask a Question

731 491 924 answers to any question