返回按属性排序的对象/哈希数组

时间:2015-06-24 07:40:12

标签: arrays ruby object attributes unique

我有一个对象数组,在这个例子中表示为哈希:

[
 { "mid" => 456, "updated" => "2015-05-05 05:06:05"}
 { "mid" => 789, "updated" => "2015-05-05 05:05:05"}
 { "mid" => 123, "updated" => "2015-05-05 05:05:07"}
]

我需要只返回具有唯一中间元素的元素,在选择唯一对象的过程中,需要考虑时间戳,其中更高的日期时间是要返回的时间戳。所以我的例子结果将是:

res = []
queue.length.times do
    a = queue.pop
    queue.each do |job|
        if a.mid == job.mid
            if DateTime.parse(a.updated) >= DateTime.parse(a.updated)
                res << a
            end
        else
            res << a
        end
    end
    queue << a
end

我尝试了几种不同的方法,但是我的逻辑有问题,我总是得到20个对象而不是3.这是我的代码:

.fill {
  width: 100%;
  height: 100%;
  background-color: green;
}
html, body, main {
  height: 100%;
}
body{
  margin: 0;
  background-color: red;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

假设您在arr输入了

arr.group_by do |h| 
  h['mid']                   # group same mids
end.values.map do |all|
  all.max_by do |h|
    Date.parse h['updated']  # pick latest by date
  end
end

#⇒ [
#    {"mid"=>123, "updated"=>"2015-05-05 05:05:07"},
#    {"mid"=>456, "updated"=>"2015-05-05 05:06:05"},
#    {"mid"=>789, "updated"=>"2015-05-05 05:05:05"}
# ]

请避免使用ruby语法编写phpish代码。

UPD 致Cary Swoveland的积分,sort_by+last缩减为max_by

答案 1 :(得分:-1)

您可以使用以下内容:

Page Footer

其中queue.sort_by { |r| DateTime.parse(r[:updated]) }.reverse.uniq { |r| r[:mid] } # => [{:mid=>456, :updated=>"2015-05-05 05:06:05"}, {:mid=>123, :updated=>"2015-05-05 05:05:07"}, {:mid=>789, :updated=>"2015-05-05 05:05:05"}] 是您的输入数组。