如何使用一个数组作为ruby中另一个数组的映射然后加入它们?

时间:2017-06-23 07:51:03

标签: arrays ruby

arr1 = [{2=>7}, {2=>3, 8=>1}, {2=>2, 5=>2}]
arr2 = [{2=>9.95, 5=>16.95, 8=>24.95}]

预期结果[ 69.65 , 54.8 , 53.8 ]

以下是计算:

所以arr1是第二个数组的地图。

所以我需要循环遍历数组1和数组2,然后匹配数组1和数组2的键,然后通过数组2的值获取数组1的值和倍数。

现在在数组1秒索引中有2个键值对,这意味着我必须按照我的解释进行操作,然后总结该哈希中的结果。

希望它有意义。

我可以通过很多循环来完成它。只是想看看是否有更好的方法,比如使用map等提高效率。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

假设您的arr2实际上是{2=>9.95, 5=>16.95, 8=>24.95}(因为将其作为数组没有任何意义)并将其重命名为hash2

arr1.map { |hash|
  hash.inject(0) { |accu, (key, multiplier)|
    accu + hash2[key] * multiplier
  }
}
编辑:可能更容易理解(但只适用于Ruby 2.4 +):

arr1.map { |hash|
  hash.sum { |key, multiplier|
    hash2[key] * multiplier
  }
}

答案 1 :(得分:3)

根据你的问题,

arr1.map{|a1| a1.keys.map{|a1k| arr2[0][a1k]*a1[a1k]}.inject(:+)}

如果arr2只是一个简单的哈希:

arr1.map{|a1| a1.keys.map{|a1k| arr2[a1k]*a1[a1k]}.inject(:+)}

答案 2 :(得分:1)

由于我们需要为arr1的每个元素计算一个内积,我们可以使用矩阵乘法。

arr = [{2=>7}, {2=>3, 8=>1}, {2=>2, 5=>2}]
h = {2=>9.95, 5=>16.95, 8=>24.95}

require 'matrix'

keys, values = h.to_a.transpose
  #=> [[2, 5, 8], [9.95, 16.95, 24.95]]

(Matrix[*arr.map { |g| keys.map { |k| g.fetch(k,0) } }] *
  Matrix.column_vector(values)).to_a.flatten
  #=> [69.64999999999999, 54.8, 53.8]

请注意

arr.map { |g| keys.map { |k| g.fetch(k,0) } }
  #=> [[7, 0, 0], [3, 0, 1], [2, 2, 0]]

请参阅MatrixHash#fetch