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
等提高效率。
感谢您的帮助。
答案 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]]
请参阅Matrix和Hash#fetch。