【问题标题】:How to get hash values from array如何从数组中获取哈希值
【发布时间】:2015-04-07 16:06:08
【问题描述】:

输入:-

array = [{"name"=>"id", "value"=>"123"}, 
         {"name"=>"type", "value"=>"app"}, 
         {"name"=>"codes", "value"=>"12"}, 
         {"name"=>"codes", "value"=>"345"}, 
         {"name"=>"type", "value"=>"app1"}] 

sample_hash = {}

功能:-

array.map {|f| sample_hash[f["name"]] = sample_hash[f["value"]] }

结果:-

sample_hash

 => {"id"=>"123", "type"=>"app", "codes"=>"345"} 

但我需要的预期结果应该如下所示:-

sample_hash

 => {"id"=>"123", "type"=>["app","app1"], "codes"=>["12", "345"]} 

我怎样才能得到我的预期输出?

【问题讨论】:

  • 虽然它不是你所要求的,但如果你有一个数组,即使对于只有一个值的键,它也会让你更容易和更好地使用散列。 "id" => ["123"] - 这样从哈希中获取值时,您不必检查是否返回了字符串或数组。
  • @mikej 同意你的看法。 API 一致性很重要且很有帮助。

标签: ruby arrays hash


【解决方案1】:

您可以使用new {|hash, key| block } Hash 构造函数初始化sample_hash,以使此哈希中的值默认初始化为空数组。 这使得在第二阶段变得更容易,其中初始数据集中的每个值都附加到相应“名称”下索引的值数组中:

sample_hash = Hash.new { |h, k| h[k] = [] }
array.each { |f| sample_hash[f['name']] << f['value'] }

Try it online

【讨论】:

    【解决方案2】:

    @w0lf 是正确的。相同,但结构不同。

    array.each_with_object({}) do |input_hash, result_hash|
      (result_hash[input_hash['name']] ||= []) << input_hash['value']
    end
    

    【讨论】:

      【解决方案3】:

      看到这个:

      array.inject({}) do |ret, a| 
          ret[a['name']] = ret[a['name']] ? [ret[a['name']], a['value']] : a['value']  
          ret
      end
      

      o/p : {"id"=&gt;"123", "type"=&gt;["app", "app1"], "codes"=&gt;["12", "345"]}

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 2011-04-16
        • 2010-12-19
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        相关资源
        最近更新 更多