如何使用作为哈希的单个元素转换数组?

时间:2013-05-16 06:36:15

标签: ruby-on-rails ruby

我有一个小但令人讨厌的问题:我的API调用经常返回一个单元素的数组,这是一个哈希如下:

foo = [{"key1" => 1, "key2" => 10}]

我必须从哈希中提取一个值,如下所示:foo[0]["key2"]。是否有更优化/更正确的方法?

4 个答案:

答案 0 :(得分:0)

您可以通过[0] / first获取第一个元素(哈希):

foo = [{"key1" => 1, "key2" => 10}]

foo[0]
# => {"key1" => 1, "key2" => 10}

foo.first
# => {"key1" => 1, "key2" => 10}

或使用Ruby的并行分配:

foo, _ = [{"key1" => 1, "key2" => 10}]

foo
# => {"key1" => 1, "key2" => 10}

这只将第一个元素分配给foo而不是整个数组。

如果您反复这样做,最好在您正在使用的API之上实现自定义方法。

答案 1 :(得分:0)

像Tilo一样:

 results.each{|r| do_something_with( r['key2] )}

你也可以这样做:

 results = [{"key1"=>1, "key2"=>10}]
 results, _ = results 
 results.each{|key, result| do_something_with( result )}

仅使用result['key2']

替换result

答案 2 :(得分:0)

根据您对提取值的处理方式,.each.collect听起来是您的最佳选择。以下是collect的示例:

results = [{"key1"=>1, "key2"=>10}]
key2_array = results.collect{|result| result["key2"]}
# key2_array contains [10]

results = [{"key1"=>1, "key2"=>10},{"key1"=>2, "key2"=>20},{"key1"=>3, "key2"=>30}]
key2_array = results.collect{|result| result["key2"]}
# key2_array contains [10,20,30]

答案 3 :(得分:0)

如果问题只是让你的代码看起来更清晰,你可以围绕API调用编写一个包装器方法:

def my_api_wrapper(x, y, z)
  fb_api_call(x, y, z).first
end

# Later...
foo = my_api_wrapper(x, y, z)
foo["key2"]