Ruby哈希数组如何将phase值转为新键、取quantity值为新值重构
Ruby哈希数组指定结构转换实现
核心处理逻辑很简单,遍历原数组的每个哈希元素,按需重构哈希结构即可,没有额外依赖。
通用兼容写法(全Ruby版本支持)
直接通过map遍历数组,逐个构造符合要求的新哈希:
original_array = [ {:ID => "aaa", :phase => "alpha", :quantity => 80}, {:ID => "aaa", :phase => "beta", :quantity => 160} ] converted_array = original_array.map do |hash_item| { :ID => hash_item[:ID], hash_item[:phase].to_sym => hash_item[:quantity] } end
处理逻辑说明:
- 用
map替代each,直接返回转换后的新数组,不用手动追加元素 - 新哈希里显式保留原
:ID键值对 - 取当前元素
:phase的字符串值,转成Symbol类型作为新键,对应值取同元素下:quantity的数值 - 新哈希不包含原
:phase、:quantity键,自然完成冗余键的移除
简洁写法(Ruby 2.5+版本支持)
如果你的运行环境是Ruby 2.5及以上,可以用Hash#slice先截取需要保留的:ID键,再合并动态生成的键值对,代码更凝练:
converted_array = original_array.map do |hash_item| hash_item.slice(:ID).merge(hash_item[:phase].to_sym => hash_item[:quantity]) end
两种写法运行后得到的converted_array结构完全符合要求:
[ {:ID=>"aaa", :alpha=>80}, {:ID=>"aaa", :beta=>160} ]
小提示:如果
:phase对应的字符串包含空格、特殊符号,转Symbol的逻辑依然生效,生成的键格式会是:"带空格的phase值",符合Ruby符号键的语法规范。
内容的提问来源于stack exchange,提问作者Michele Zampiccoli
相关产品推荐
相关产品推荐

