删除数组中的重复项并将其第二个值添加到数组中
我要转换:
[["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检查。