【问题标题】:Rails Ruby array of hashes merged by key to average valueRails Ruby 哈希数组按键合并到平均值
【发布时间】:2014-03-12 20:36:40
【问题描述】:

我有一个 activerecord 方法可以找到一周的所有事件, myevents.map { |x| x.start_date.day => [x.title]} (start_date 是一个日期时间字段,title 是一个字符串) 这给了我一个哈希数组;

    [{11=>["40"]}, {11=>["0"]}, {11=>["0"]}, {11=>[""]}, 
     {11=>["0"]}, {11=>["0"]}, {11=>["33"]}, {12=>["9"]}, 
     {11=>["34"]}, {11=>["29"]}, {11=>["8"]}, {11=>["31"]}, 
     {11=>["40"]}, {11=>["34"]}] 

我想映射这些值,所以我得到一个看起来像这样的数组;

[ {11=>[ average of values that occur on the 11th]}, 
  {12=>[average of values that occur on the 12th]} ]

但我不太确定如何获得它。

【问题讨论】:

    标签: ruby-on-rails ruby arrays hash


    【解决方案1】:

    我会使用 group_byinjectmap

    ar = [  
            {11=>["40"]}, {11=>["0"]}, {11=>["0"]}, {11=>[""]},
            {11=>["0"]}, {11=>["0"]}, {11=>["33"]}, {12=>["9"]},
            {11=>["34"]}, {11=>["29"]}, {11=>["8"]}, {11=>["31"]}, 
            {11=>["40"]}, {11=>["34"]}
         ]
    
    # first grouping the inner hash keys like on 11,12,etc. In each iteration, 
    # {11=>["40"]}, {11=>["0"]} are being passed to the block of `group_by`. Now
    # `h.keys.first` gives 11 from `{11=>["40"]}` and 11 from `{11=>["0"]}` likewise.
    ary = ar.group_by { |h| h.keys.first }.map do |k,v|
      { k => v.map { |h| h[k][0].to_i }.inject(:+) / v.size } 
    end
    
    ary # => [{11=>19}, {12=>9}]
    

    【讨论】:

    • 在 'h.keys.first' 中'first' 做了什么?
    • @raphael_turtle 先做p ar.group_by { |h| h.keys.first },看看下一个map块在做什么。
    【解决方案2】:

    另一种方法:--

    array = [  
            {11=>["40"]}, {11=>["0"]}, {11=>["0"]}, {11=>[""]},
            {11=>["0"]}, {11=>["0"]}, {11=>["33"]}, {12=>["9"]},
            {11=>["34"]}, {11=>["29"]}, {11=>["8"]}, {11=>["31"]}, 
            {11=>["40"]}, {11=>["34"]}
         ]
    
        array.each_with_object({}) { |hObj, newHash| hObj.each { |k,v| 
             (newHash[k] ||= []) << v.first.to_i } }.collect{|k,v| 
             {k => (v.inject(:+))/v.size}}
    
    => [{11=>19}, {12=>9}]
    

    【讨论】:

      猜你喜欢
      • 2013-07-06
      • 2019-03-03
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2013-04-06
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多