我有一个小而烦人的问题:我的 API 调用经常返回一个包含单个元素的数组,它是一个哈希,如下所示:
foo = [{"key1" => 1, "key2" => 10}]
我必须从哈希中提取一个值,如下所示foo[0]["key2"]
:有没有更优化/正确的方法来做到这一点?
我有一个小而烦人的问题:我的 API 调用经常返回一个包含单个元素的数组,它是一个哈希,如下所示:
foo = [{"key1" => 1, "key2" => 10}]
我必须从哈希中提取一个值,如下所示foo[0]["key2"]
:有没有更优化/正确的方法来做到这一点?
您可以通过[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 之上实现自定义方法可能是一个好主意。
就像蒂洛的:
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
根据您要对提取的值执行的操作,.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]
如果问题只是让你的代码看起来更干净一些,你可以围绕你的 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"]