我有一个对象数组,在这个例子中表示为哈希:
[
{ "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;
}
有什么想法吗?
答案 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"}]
是您的输入数组。