Имейте данные, которые имеют такую структуру. Будет в порядке возрастания на «с».
[ { 'a' => 1, 'b' => 1, 'c' => 1, 'd' => '?' },
{ 'a' => 1, 'b' => 1, 'c' => 2, 'd' => '?' },
{ 'a' => 1, 'b' => 1, 'c' => 3, 'd' => '?' },
{ 'a' => 1, 'b' => 2, 'c' => 4, 'd' => '?' },
{ 'a' => 1, 'b' => 2, 'c' => 5, 'd' => '?' },
{ 'a' => 2, 'b' => 1, 'c' => 6, 'd' => '?' },
{ 'a' => 2, 'b' => 1, 'c' => 7, 'd' => '?' },
{ 'a' => 2, 'b' => 1, 'c' => 8, 'd' => '?' },
{ 'a' => 2, 'b' => 2, 'c' => 9, 'd' => '?' },
{ 'a' => 2, 'b' => 2, 'c' => 10, 'd' => '?' } ]
Требуется массив максимального значения «c», сгруппированный по каждой уникальной комбинации «a» и «b».
[ { 'a' => 1, 'b' => 1, 'c' => 3, 'd' => '?' },
{ 'a' => 1, 'b' => 2, 'c' => 5, 'd' => '?' },
{ 'a' => 2, 'b' => 1, 'c' => 8, 'd' => '?' },
{ 'a' => 2, 'b' => 2, 'c' => 10, 'd' => '?' } ]
Остальные ключи необходимо сохранить, но они никак не связаны с трансформацией. Лучшее, что я мог понять до сих пор, - это перевернуть массив (таким образом, по убыванию, упорядоченный по «c»), uniq по «a» и «b» и снова перевернуть массив. Но я в зависимости от реализации uniq_by всегда возвращаю первый найденный уникальный элемент. В спецификации об этом не говорится, поэтому я беспокоюсь о том, чтобы полагаться на это поведение, поскольку оно может измениться в будущих версиях. Также интересно, может ли это быть действительно неэффективным методом.
@data.reverse!.uniq!{|record| [record['a'],record['b']]}.reverse!
Есть ли лучший и более эффективный способ сделать это? Если у вас есть лучший способ, не могли бы вы также объяснить его, вместо того, чтобы просто давать мне супер неприятную строчку, которую я, возможно, не смогу расшифровать.