Ruby中如何将由hash组成的array转换为目标hash结构
Ruby数组转对应集合/哈希结构实现
首先需要明确:你给出的目标格式本身不是合法的Ruby Hash结构——Ruby的Hash要求所有元素必须是键值对形式,不能直接在大括号内平铺多个Hash对象而不指定键值映射关系。结合常见开发场景,对应实现分两类:
- 如果你要的是大括号包裹、元素去重的集合结构(和你给出的示例输出格式完全匹配),本质是将数组转为Set类型
- 如果你要的是标准可运行的Hash结构,需要先明确键值映射规则,最常见的是用唯一标识字段作为键、原始Hash作为值
转Set(和示例格式完全匹配)
需要先引入Ruby标准库的set模块,直接调用to_set方法即可:
require 'set' # 原始数组 source = [ {:id=>"6", :created_at=>"2022-06-10", :value=>"2.159", :type=>"book"}, {:id=>"8", :created_at=>"2022-06-10", :value=>"2.097", :type=>"poem"}, {:id=>"3", :created_at=>"2022-06-10", :value=>"2.207", :type=>"book"} ] result = source.to_set
运行后得到的Set输出格式和你给出的示例完全一致:
#<Set: {{:id=>"6", :created_at=>"2022-06-10", :value=>"2.159", :type=>"book"}, {:id=>"8", :created_at=>"2022-06-10", :value=>"2.097", :type=>"poem"}, {:id=>"3", :created_at=>"2022-06-10", :value=>"2.207", :type=>"book"}}>
转标准Hash结构
如果需要合法的Hash结构,最常用的转换规则是用每条数据的唯一id作为键,原始数据Hash作为值,Ruby 2.6+版本可以直接用to_h方法实现:
source = [ {:id=>"6", :created_at=>"2022-06-10", :value=>"2.159", :type=>"book"}, {:id=>"8", :created_at=>"2022-06-10", :value=>"2.097", :type=>"poem"}, {:id=>"3", :created_at=>"2022-06-10", :value=>"2.207", :type=>"book"} ] result = source.to_h { |item| [item[:id], item] }
得到的合法Hash结构如下:
{ "6" => {:id=>"6", :created_at=>"2022-06-10", :value=>"2.159", :type=>"book"}, "8" => {:id=>"8", :created_at=>"2022-06-10", :value=>"2.097", :type=>"poem"}, "3" => {:id=>"3", :created_at=>"2022-06-10", :value=>"2.207", :type=>"book"} }
如果你的键值映射规则不是按id聚合,只需要修改to_h块里的返回值,传入你需要的[键, 值]数组即可。
内容的提问来源于stack exchange,提问作者TheGame
相关产品推荐
相关产品推荐

