如何找到一些具有一定值的数组并将它们的值相加?

时间:2014-09-23 22:44:19

标签: ruby arrays

我有一个有很多价值的数组。总是第一个和第三个元素重复,我只需要对第二个元素求和,因为这是一个我想要累加的数字。

然后创建一个包含所有值累加的新数组。

实施例

# My array

=> [ ['abc', 13, 40 ], [ 'abc', 20, 40 ], [ 'abc', 2, 40 ], [ 'cde', 90, 20 ], [ 'cde', 60, 20 ], [ 'fgh', 20, 50 ] ]

# My Expected Result

=> [ ['abc', 35, 40 ], ['cde', 150, 20], ['fgh', 20, 50] ]

最佳方法是什么?可以用什么函数来达到这个结果?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

arr = [[ 'abc', 13, 40 ], [ 'abc', 20, 40 ], [ 'abc',  2, 40 ],
       [ 'cde', 90, 20 ], [ 'cde', 60, 20 ], [ 'fgh', 20, 50 ] ]

arr.group_by { |a,_,c| [a,c] }
   .map { |(a,b),arr| [a,arr.reduce(0) { |t,(_,e,_)| t + e },b] }
  #=> [["abc",  35, 40],
  #    ["cde", 150, 20],
  #    ["fgh",  20, 50]]

这是如何工作的:

f = arr.group_by { |a,_,c| [a,c] }
  #=> {["abc", 40]=>[["abc", 13, 40], ["abc", 20, 40], ["abc", 2, 40]],
  #    ["cde", 20]=>[["cde", 90, 20], ["cde", 60, 20]],
  #    ["fgh", 50]=>[["fgh", 20, 50]]}

map将散列f的第一个键值对传递到其块中,分配块变量(使用分解),如下所示:

a,b = ["abc", 40]
arr = [["abc", 13, 40], ["abc", 20, 40], ["abc", 2, 40]]

然后计算:

[a,g,b]
#=> ["abc", g, 40]

,其中

g = arr.reduce(0) { |t,(_,e,_)| t + e }
  #=> 35

所以

["abc", 40]=>[["abc", 13, 40], ["abc", 20, 40], ["abc", 2, 40]]

映射到:

["abc", 35, 40]

哈希f的另外两个元素的计算方法类似。

答案 1 :(得分:0)

arr.group_by { |a,_,c| [a,c] }.values.map{|x|[x[0][0],x.map{|n|n[1]}.reduce(&:+),x[0][2]]}