在哈希数组中合并重复的值

时间:2018-07-18 09:15:17

标签: ruby hash

我有这样的哈希数组

arr_of_hashes = [
  {"started_at"=>"2018-07-11", "stopped_at"=>"2018-07-11"},
  {"started_at"=>"2018-07-13", "stopped_at"=>"2018-07-13"},
  {"started_at"=>"2018-07-13", "stopped_at"=>"2018-07-13"}, 
  {"started_at"=>"2018-07-16", "stopped_at"=>"2018-07-16"},
  {"started_at"=>"2018-07-16", "stopped_at"=>"2018-07-16"},
  {"started_at"=>"2018-07-16", "stopped_at"=>"still active"}
]

我要删除重复项。此外,其中:

{"started_at"=>"2018-07-16", "stopped_at"=>"2018-07-16"},
{"started_at"=>"2018-07-16", "stopped_at"=>"still active"}

我只想保留最后一行。我该怎么办?

我试图做:

sorted_arr = arr_of_hashes.uniq

3 个答案:

答案 0 :(得分:2)

arr_of_hashes.reverse.uniq { |hash| hash["started_at"] }.reverse

关于pass block to uniq和大约reverse

#result
[
  {"started_at"=>"2018-07-11", "stopped_at"=>"2018-07-11"},
  {"started_at"=>"2018-07-13", "stopped_at"=>"2018-07-13"},
  {"started_at"=>"2018-07-16", "stopped_at"=>"still active"}
]

答案 1 :(得分:0)

像这样吗?

[2] pry(main)> arr_of_hashes.reject { |h| h['started_at'] == h['stopped_at'] }
[
    [0] {
        "started_at" => "2018-07-16",
        "stopped_at" => "still active"
    }
]

您的问题尚不清楚,您想获得什么输出

答案 2 :(得分:0)

arr_of_hashes.each_with_object({}) { |g,h| h.update(g["started_at"]=>g) }.values
  #=> [{"started_at"=>"2018-07-11", "stopped_at"=>"2018-07-11"},
  #    {"started_at"=>"2018-07-13", "stopped_at"=>"2018-07-13"},
  #    {"started_at"=>"2018-07-16", "stopped_at"=>"still active"}]

请参见Hash#update(又称merge!),请注意values的接收方如下。

arr_of_hashes.each_with_object({}) { |g,h| h.update(g["started_at"]=>g) }
  #=> {"2018-07-11"=>{"started_at"=>"2018-07-11", "stopped_at"=>"2018-07-11"},
  #    "2018-07-13"=>{"started_at"=>"2018-07-13", "stopped_at"=>"2018-07-13"},
  #    "2018-07-16"=>{"started_at"=>"2018-07-16", "stopped_at"=>"still active"}}