ruby – 将哈希数组转换为哈希散列,由哈希的属性索引

前端之家收集整理的这篇文章主要介绍了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(下面)
>使用api_response.find {| x | x [:id] == i}对于我需要访问的每个记录.
>一种我不知道的方法,可能涉及一种使用地图本机构建哈希的方法.

我的映射方法

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流程.这就是为什么@L_404_1@提出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

猜你在找的Ruby相关文章