删除数组中的重复项并将其第二个值添加到数组中

我要转换:

[["val1", "1"], ["val2", "2"], ["val1", "3"], ["val3", "4"], ["val2", "5"], ["val2", "6"]] 

至:

 [["val1", ["1", "3"]], ["val2", ["2", "5", "6"]], ["val3", ["4"]] 

删除子arrays的第一个值( "val1" )的副本,并将它们的第二个值( "1""3" )放在一个数组中。

我可以在arrays上调用uniq ,但这只能解决问题的一半。 我给了我最好的裂缝:

  • 将第二个数组的第一个值(我们可以调用值a)存储到另一个2d数组中,并在新数组上调用.uniq。
  • 新的2d数组在值b中有一个空数组。
  • 然后使用if语句循环遍历新数组,将原始数组值a与新数组值a进行比较。 如果原始数组中的值a与新数组中的val a匹配,则将其b值添加到新数组b值数组中。

这是我的方法,但很可能是一种更简单的方法。

 [["val1", "1"], ["val2", "2"], ["val1", "3"], ["val3", "4"], ["val2", "5"], ["val2", "6"]] .group_by(&:first).map{|k, a| [k, a.map(&:last)]} # => [["val1", ["1", "3"]], ["val2", ["2", "5", "6"]], ["val3", ["4"]]] 

这是实现相同目标的另一种方法:

 ary.each_with_object(Hash.new {|h, k| h[k] = []}) do |i, h| h[i.first] << i.last end.to_a #=> [["val1", ["1", "3"]], ["val2", ["2", "5", "6"]], ["val3", ["4"]]] 

我们使用Hash来初始化具有空数组的键,并且它有助于块将值推入数组而不必进行nil检查。