我必须检查并从哈希数组中选择最新的一个。结构是这样的:
'histories':[
{
{
...
},
'created': "date1",
'items':[
{
'a': "Ready",
'b': "dfknsknfs",
},
{
'a': "sdfjbsf",
'b': "hello23",
}
]
},
{
{
...
},
'created': "date2",
'items':[
{
'a': "sknfkssd",
'b': "ksdfjshs",
},
{
'a': "Ready",
'b': "shdfjsh",
}
]
},
...
]
我必须首先找到价值" Ready"然后我必须选择最新的"创建"日期。
我的尝试就像
ready_item = histories.select { |item| item.items.detect {|f| f.a == "Ready" } }
ready_item
但是由于使用了detect
,它只返回第一个检测到的值。但我需要得到最新的约会。它的可能解决方案应该是什么?
答案 0 :(得分:2)
histories.select { |h|
h[:items].detect {|f| f[:a] == 'Ready' }
}.sort_by {|x| x[:created_at] }.last
答案 1 :(得分:1)
我已经或多或少地使用了红宝石,如果我正确地解决了这个要求,请转到:
hash = { histories:[
{ created: "2014-04-01",
items:[
{ a: "Ready", b: "NOT to be chosen" },
{ a: "sdfjbsf", b: "hello23" }
]},
{ created: "2015-04-01",
items:[
{ a: "Ready", b: "to be chosen" },
{ a: "sdfjbsf", b: "hello23" }
]},
{ created: "2014-03-01",
items:[
{ a: "sknfkssd", b: "ksdfjshs" },
{ a: "unready", b: "shdfjsh" }
]}
]}
hash[:histories].select do |item|
item[:items].detect do |item|
item[:a] == 'Ready' # select ready only
end
end.reduce(nil) do |memo, item| # reduce to newest
memo = item if memo.nil? ||
Date.parse(memo[:created]) < Date.parse(item[:created])
end
#⇒ {
# :created => "2015-04-01",
# :items => [
# [0] {
# :a => "Ready",
# :b => "to be chosen"
# },
# [1] {
# :a => "sdfjbsf",
# :b => "hello23"
# }
# ]
# }