如何在多维数组中聚合某些数组?

时间:2019-07-11 18:22:46

标签: ruby

我有一个嵌套数组,需要按照下面所示的方式聚合除最后一个元素之外相等的内部数组。

_array = [["Nokia","Review","3"], ["Nokia","Review","2"],
          ["Samsung","Review","4"], ["Apple","Review","4"],
          ["Apple","Review","3"]]

所需的输出:

[["Nokia","Review","5"], ["Samsung","Review","4"], ["Apple","Review","7"]]

2 个答案:

答案 0 :(得分:3)

这是一个非常奇怪的形式,因为数字是字符串,但是您可以通过一点转换来积累:

array = [["Nokia","Review","3"], ["Nokia","Review","2"], ["Samsung","Review","4"], ["Apple","Review","4"], ["Apple","Review","3"]]

# Define a tabulator Hash defaulting to count of 0
array.each_with_object(Hash.new(0)) do |a,h|
  # Use the first two elements of the array as the key
  h[a[0,2]] += a[2].to_i
end.map do |k, v|
  # Convert back to string value, combining key and count
  k + [ v.to_s ]
end

# => [["Nokia", "Review", "5"], ["Samsung", "Review", "4"], ["Apple", "Review", "7"]]

如您所见,如果数据采用其他形式,或者即使数字实际上是整数,也将变得容易得多。

答案 1 :(得分:3)

一个衬垫,只是为了好玩:

_array.group_by{ |e| e.first(2) }
      .transform_values { |v| v.sum { |e| e.last.to_i } }
      .map { |k, v| k << v.to_s }

#=> [["Nokia", "Review", 5], ["Samsung", "Review", 4], ["Apple", "Review", 7]]


一些有助于理解

的步骤
_array.group_by{ |e| e.first(2) }
#=> {["Nokia", "Review"]=>[["Nokia", "Review", "3"],["Nokia", "Review", "2"]],
#    ["Samsung", "Review"]=>[["Samsung", "Review", "4"]],
#    ["Apple", "Review"]=>[["Apple", "Review", "4"], ["Apple", "Review", "3"]]}

_array.group_by{ |e| e.first(2) }.transform_values { |v| v.sum { |e| e.last.to_i } }
#=> {["Nokia", "Review"]=>5, ["Samsung", "Review"]=>4, ["Apple", "Review"]=>7}

然后map