【问题标题】:How to convert an array with a single element that is a hash?如何将具有单个元素的数组转换为哈希?
【发布时间】:2013-05-16 06:36:14
【问题描述】:

我有一个小而烦人的问题:我的 API 调用经常返回一个包含单个元素的数组,它是一个哈希,如下所示:

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

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

【问题讨论】:

  • var = var[0]var["value"]?还是我错过了什么?
  • 您也可以使用return.first['key2'] -- 根据查询是什么(数据库查询?),您可能还想使用results.each{|r| do_something_with( r['key2] )} 浏览所有结果
  • 你的问题是什么?
  • 除了像 Tilo 建议的那样使用 first 之外,我看不到任何其他方法可以做到这一点。如果你只对第一个元素感兴趣,为什么不改变你的 API,让它只返回一个哈希值而不是一个数组内的哈希值?
  • Mischa:它是 Facebook API。老神,Tilo & Dogbert:你是对的。我发现这对 Ruby 来说不够“优雅”。我认为 Tilo 的更好。

标签: ruby-on-rails ruby


【解决方案1】:

您可以通过[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 之上实现自定义方法。

【讨论】:

    【解决方案2】:

    喜欢蒂洛的:

     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

    【讨论】:

      【解决方案3】:

      根据您要对提取的值执行的操作,.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]
      

      【讨论】:

        【解决方案4】:

        如果问题只是让您的代码看起来更简洁,您可以围绕 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"]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-06
          • 1970-01-01
          • 2015-11-26
          • 1970-01-01
          • 2019-10-27
          • 2019-05-23
          • 2012-10-29
          相关资源
          最近更新 更多