我有一个嵌套数组,需要按照下面所示的方式聚合除最后一个元素之外相等的内部数组。
_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"]]
答案 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
。