简体   繁体   English

如何从 ruby 中的哈希数组更改 hash 键?

[英]How to change hash key from array of hashes in ruby?

Given:鉴于:

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

This is the expected result.这是预期的结果。 Array should have first 5 elements.数组应该有前 5 个元素。

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

This is what I tried:这是我尝试过的:

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

Any other optimized solution?还有其他优化的解决方案吗?

You can also use .map and .tap like this您也可以像这样使用.map.tap

data.map do |h|
 h.tap { |m_h| m_h["user_ids"]= m_h["user_ids"].split(',').first(5)}
end
data = [
    {"votable_id"=>1150, "user_ids"=>"1,2,3,4,5,6,"},
    {"votable_id"=>1151, "user_ids"=>"55,66,34,23,56,7,8"}
]

Code代码

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

p h

Output Output

[{"votable_id"=>1150, "user_ids"=>["1", "2", "3", "4", "5"]}, {"votable_id"=>1151, "user_ids"=>["55", "66", "34", "23", "56"]}]
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"]}] 

See Hash#merge .请参阅Hash#merge This leaves data unchanged.这使data保持不变。 To modify (or mutate ) data use Hash#merge!要修改(或变异data ,请使用Hash#merge! (aka update ). (又名update )。 h.merge(k=>v) is a shortcut for h.merge({ k=>v }) . h.merge(k=>v)h.merge({ k=>v })的快捷方式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM