Как изменить хэш-ключ из массива хэшей в ruby? - PullRequest
1 голос
/ 07 ноября 2019

Дано:

data = [
  {"votable_id"=>1150, "user_ids"=>"1,2,3,4,5,6,"},
  {"votable_id"=>1151, "user_ids"=>"55,66,34,23,56,7,8"}
]

Это ожидаемый результат. Массив должен иметь первые 5 элементов.

data = [
  {"votable_id"=>1150, "user_ids"=>["1","2","3","4","5"]},
  {"votable_id"=>1151, "user_ids"=>["55","66","34","23","56","7",8"]}
]

Это то, что я пробовал:

data.map{|x| x['user_ids'] = x['user_ids'].split(',').first(5)}

Любое другое оптимизированное решение?

Ответы [ 3 ]

4 голосов
/ 07 ноября 2019

Вы также можете использовать .map и .tap вот так

data.map do |h|
 h.tap { |m_h| m_h["user_ids"]= m_h["user_ids"].split(',').first(5)}
end
1 голос
/ 07 ноября 2019
data.map { |h| h.merge("user_ids"=>h["user_ids"].split(',').first(5)) }
  #=> [{"votable_id"=>1150, "user_ids"=>["1", "2", "3", "4", "5"]},
  #    {"votable_id"=>1151, "user_ids"=>["55", "66", "34", "23", "56"]}] 

См. Hash # merge . Это оставляет data без изменений. Для изменения (или mutate ) data используйте Hash # merge! (он же update). h.merge(k=>v) является сокращением для h.merge({ k=>v }).

1 голос
/ 07 ноября 2019
data = [
    {"votable_id"=>1150, "user_ids"=>"1,2,3,4,5,6,"},
    {"votable_id"=>1151, "user_ids"=>"55,66,34,23,56,7,8"}
]

Код

h=data.map do |h|
  h["user_ids"]=[h["user_ids"].split(',').first(5)].flatten
  h
end

p h

Выход

[{"votable_id"=>1150, "user_ids"=>["1", "2", "3", "4", "5"]}, {"votable_id"=>1151, "user_ids"=>["55", "66", "34", "23", "56"]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...