2015-04-29 8 views
0

Мне нужно проверить и выбрать последний из массива хешей. Структура такова:Проверьте и выберите последний из массива хэшей

'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

У вас есть неправильный синтаксис хэша и ваша попытка не работает тоже, потому что это недопустимое выражение. –

+0

Я опубликовал такую ​​же структуру. Не могу опубликовать данные из него. его частный –

+0

нормально, но 'item.items.detect' не работает. –

ответ

2
histories.select { |h| 
    h[:items].detect {|f| f[:a] == 'Ready' } 
}.sort_by {|x| x[:created_at] }.last 
+0

'sort_by' доказал свою эффективность, но сортировка здесь абсолютно лишняя, хотя и жадна к ресурсам. – mudasobwa

+0

Да, 'сокращение' выглядит лучше здесь. Но он может быть отсортирован заранее для поиска многих элементов. – lx00st

+0

В любом случае, рассмотрите наилучшую практику использования 'sort_by {| x | x [: created_at]} 'вместо простого' sort'. Плюс 'f.a' должен быть' f [: a] '. – mudasobwa

1

Я сделал хэш более или менее rubyish и если я правильно undrestood требования, здесь вы идете:

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" 
# } 
# ] 
# } 

 Смежные вопросы

  • Нет связанных вопросов^_^