如何将Ruby哈希数组转换为指定结构的哈希?
Ruby数组转指定结构哈希的实现方案
当然可以实现啦!Ruby的Enumerable模块自带了超多实用方法,轻松搞定这种数组到哈希的转换,给你分享几种常用的方案:
方法一:用each_with_object(直观易懂)
这种方法逻辑清晰,适合刚接触Ruby的朋友理解:
array = [{ a: 123, b: 'foo', c: 'bar' }, { a: 456, b: 'baz', c: 'qux' }] result = array.each_with_object({}) do |item, hash| hash[item[:a]] = item.except(:a) end # 输出结果: # { 123 => { b: 'foo', c: 'bar' }, 456 => { b: 'baz', c: 'qux' } }
解释:each_with_object会初始化一个空哈希作为累加容器,遍历数组时把每个元素的:a值当作键,再用except(:a)去掉当前元素里的:a键值对,剩下的部分作为对应的值存入哈希。
方法二:用to_h(简洁优雅)
如果想写得更紧凑,to_h方法是绝佳选择,它可以直接通过块来定义键值对:
array = [{ a: 123, b: 'foo', c: 'bar' }, { a: 456, b: 'baz', c: 'qux' }] result = array.to_h { |item| [item[:a], item.except(:a)] }
解释:块里返回一个[键, 值]的数组,to_h会自动把这些数组转换成对应的哈希结构,一行代码就能搞定!
兼容旧Ruby版本的方案(Ruby < 2.4)
如果你的Ruby版本低于2.4,Hash#except方法还不存在,可以用以下两种替代方案:
方案A:用slice指定保留的键
明确指定要保留:b和:c:
result = array.each_with_object({}) do |item, hash| hash[item[:a]] = item.slice(:b, :c) end
方案B:用dup+delete(避免修改原数组)
先复制原元素再删除:a,防止原数组被修改:
result = array.each_with_object({}) do |item, hash| temp_item = item.dup key = temp_item.delete(:a) hash[key] = temp_item end
这些方法都能完美实现你想要的转换效果,根据自己的Ruby版本和代码风格选择就好~
内容的提问来源于stack exchange,提问作者Niro
相关产品推荐
相关产品推荐

