Ruby数组的哈希值最大值为重复项

时间:2016-01-19 08:56:52

标签: arrays ruby hash

我有一个哈希数组,它包含一些重复的键。

 [{:number=>116498,
  :account=>206161,
  :tax_id=>"320996279",
  :created=>"11/13/2015"
  },
 {:number=>116500,
  :account=>206161,
  :tax_id=>"320996279",
  :created=>"12/13/2015"
  },
 {:number=>116499,
  :account=>206161,
  :tax_id=>"320996279",
  :created=>"01/13/2015"
  },
 {:number=>116501,
  :account=>206162,
  :tax_id=>"122032382",
  :created=>"11/13/2015"
  }]

请注意,密钥tax_id具有重复值。我想迭代哈希数组并以这种方式获得我的输出,其中(:created)键具有最大值

    [
 {:number=>116500,
  :account=>206161,
  :tax_id=>"320996279",
  :created=>"12/13/2015"
  },
 {:number=>116501,
  :account=>206162,
  :tax_id=>"122032382",
  :created=>"11/13/2015"
  }]

1 个答案:

答案 0 :(得分:1)

这应该有效(假设你的数组被称为a):

a.group_by{|el| el[:tax_id]}.values.map{|el| el.max_by{|x| x[:created]}}

正如评论中所指出的,这假定max是通过简单的字符串比较计算的,如果想要进行日期比较,您可能希望将created转换为Date或DateTime。以下内容将添加:created_date并使用它来计算max:

a.each{|el| el.merge!( {created_date: Date.strptime(el[:created], '%m/%d/%Y')})}.group_by{|el| el[:tax_id]}.values.map{|el| el.max_by{|x| x[:created_date]}}

其工作原理如下:

  1. 我们遍历数组,为每个哈希添加:created_date;
  2. 我们按:tax_id分组,这将采用["tax_id_1" => [ {…}, …], "tax_id_2" => …];
  3. 的形式
  4. 我们只获取值,因为我们不关心tax_ids;
  5. 对于具有相同tax_id的每个数组,我们只保留具有最大:created_date的数组。