结合三个数组

时间:2012-10-19 23:57:56

标签: ruby arrays

我有三个数组。我基本上需要把它们叠在一起。

first = [[111, 1], [222, 2], [333, 3]]
second = [[111, 4], [222, 5], [333, 6]]
third = [[111,7], [222, 8], [333, 9]]

理想情况下,如果最终数组看起来像这样会很棒:

final = [[111, 1, 4, 7], [222, 2, 5, 8], [333, 3, 6, 9]]

我看了一下产品方法,希望这可能有所帮助,但不会。我也试图遍历所有三个,但我想我并不那么聪明。

3 个答案:

答案 0 :(得分:7)

Combine他们,然后group他们,然后map他们符合您的规范:

(first + second + third).group_by(&:first).map { |k, v| [k, *v.map(&:last)] }

答案 1 :(得分:1)

[first,second,third].transpose.map do |array|
  array.reduce { |init,e| init << e.last }
end

=> [[111, 1, 4, 7], [222, 2, 5, 8], [333, 3, 6, 9]]

处理数组中的几个最后元素:

[first,second,third].transpose.map do |array|
  array.reduce { |init,e| init + e.drop(1) }
end

答案 2 :(得分:1)

不确定这是否有效,但我是在手机上完成的......所以肯定有更好的方法来实现它

first = [[111, 1], [222, 2], [333, 3]]
second = [[111, 4], [222, 5], [333, 6]]
third = [[111,7], [222, 8], [333, 9]]

all = [first, second, third]

hash = {}

all.each do |arr|
  arr.each do |elem|
    hash[elem[0]] ||= []
    hash[elem[0]] << elem[1]
  end
end

Array.new hash.map { |k,v| [k, *v]}

获取更多元素

hash[elem[0]].concat elem[1..-1]