拥有具有这种结构的数据。将按“c”升序排列。
[ { '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' => '?' } ]
想要由“a”和“b”的每个唯一组合分组的“c”最大值数组。
[ { '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!
有没有更好更有效的方法来做到这一点?如果您确实有更好的方法,您能否也请解释一下,而不是只给我一个我可能无法破译的超级讨厌的单行字。