0

配列の配列が 3 つあります。私は基本的にそれらを互いに重ねる必要があります。

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つすべてをループしようとしましたが、私はそれほど頭が良くないと思います。

4

3 に答える 3

7

それらを結合し、グループし、仕様に合わせてマッピングします。

(first + second + third).group_by(&:first).map { |k, v| [k, *v.map(&:last)] }
于 2012-10-20T00:52:38.083 に答える
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
于 2012-10-20T00:17:30.060 に答える
1

Not sure if this is working but I done it at the phone so... And for sure there are better ways to achieve it

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]}

For more elems

hash[elem[0]].concat elem[1..-1]
于 2012-10-20T00:39:38.193 に答える