ruby – 将哈希数组转换为哈希散列,由哈希的属性索引
我有一个数组哈希表示对象作为API调用的响应.我需要从一些哈希数据中抽取数据,一个特定的键作为散列对象的id.我想将数组转换成一个哈希值,其中的键为ids,并且这些值为原始哈希值.
这就是我在说的: api_response = [ { :id => 1,:foo => 'bar' },{ :id => 2,:foo => 'another bar' },# .. ] ideal_response = { 1 => { :id => 1,2 => { :id => 2,# .. } 有两种方法可以想到这样做. >将数据映射到ideal_response(下面) 我的映射方法: keys = data.map { |x| x[:id] } mapped = Hash[*keys.zip(data).flatten] 我忍不住感觉到有这样做更有效率,更简洁的方式.当存在非常少量需要访问的记录时,选项2是非常好的.映射在这里非常出色,但当响应中有很多记录时,它会开始分解.幸运的是,我不期望有超过50-100条记录,所以映射是足够的. 在Ruby中有没有更聪明,更整洁或更有效的做法? 解决方法
Ruby <= 2.0
Hash[api_response.map { |r| [r[:id],r] }] # {1=>{:id=>1,:foo=>"bar"},2=>{:id=>2,:foo=>"another bar"}} 然而,Hash::[]是非常丑陋的,打破了通常的从左到右的OOP流程.这就是为什么Facets提出Enumerable#mash: require 'facets' api_response.mash { |r| [r[:id],r] } # {1=>{:id=>1,:foo=>"another bar"}} 这个基本的抽象(转换枚举到散列)被要求被包含在Ruby很久以前,唉,without luck. Ruby> = 2.1 [更新]仍然没有爱Enumerable#mash,但现在我们有Array#to_h.不理想(因为创建了一个中间数组),但它比没有更好: # ruby 2.1 api_response.map { |r| [r[:id],r] }.to_h (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |