Мне нужно сократить массив хэшей в один хеш, если этот ключ хеша совпадает.
my_array
- это массив хэшей, каждый из которых имеет два ключа: один объект активной записи,другой массив различных активных объектов записи, например:
my_array = [
{
first_hash_key: {id: 1, title: "my title"},
second_hash_key: ["stuff", "more stuff", "more stuff"]
},
{
first_hash_key: {id: 1, title: "my title"},
second_hash_key: ["stuff 3", "uniq stuff 2"]
},
{
first_hash_key: {id: 2, title: "my other title"},
second_hash_key: ["interesting stuff", "uniq stuff"]
}
]
Я хочу объединить хэши на first_hash_key[:id]
, добавить каждый элемент в hash_key_two
в массив, а не перезаписать их, чтобы получить:
my_array = [
{
first_hash_key: {id: 1, title: "my title"},
second_hash_key: [
["stuff", "more stuff", "more stuff"],
["stuff 3", "uniq stuff 2"]
]
},
{
first_hash_key: {id: 2, title: "my other title"},
second_hash_key: ["interesting stuff", "uniq stuff"]
}
]
Я могу уменьшить массив и хэш верхнего уровня и использовать merge
, но я теряю отдельные массивы внутри хеша.
Я также пытался группировать по id
из first_hash_key
, а затем вводить так:
my_array.group_by{|h| h[:first_hash_key]}.map{|k,v| v.inject(:merge)}
Опять я теряю массивы в second_hash_key
.Я получаю только последний массив в списке.Без map
я получаю массив каждого хэша в группе, но верхний уровень не объединяется.
[
{
:first_hash_key=>{:id=>1, :title=>"my title"},
:second_hash_key=>["stuff 3", "uniq stuff 2"]
},
{
:first_hash_key=>{:id=>2, :title=>"my other title"},
:second_hash_key=>["interesting stuff", "uniq stuff"]
}
]
Обновление Как отметили sawa и cary, нет смысла угадывать ключ second_hash_key, если данные являются массивом или массивом или массивами, лучше всегда иметь массивмассивы.Желаемый вывод:
[{:first_hash_key=>{:id=>1, :title=>"my title"},
:second_hash_key=>[["stuff", "more stuff", "more stuff"],
["stuff 3", "uniq stuff 2"]]
},
{:first_hash_key=>{:id=>2, :title=>"my other title"},
:second_hash_key=>[["interesting stuff", "uniq stuff"]]
}]